Да. Это правильное поведение и сравнение.
По крайней мере, в Python A and B
возвращает B
, если A
по существу True
, в том числе, если A
NOT Null, NOT None
НЕ пустой контейнер (например, пустой list
, dict
и т. Д.). A
возвращается IFF A
по существу False
или None
или Empty или Null.
С другой стороны, A or B
возвращает A
, если A
по существу True
, в том числе, если A
НЕ НУЛЬНО, NOT None
NOT Пустое контейнер (например, пустой list
, dict
и т. д.), в противном случае он возвращает B
.
Легко не заметить (или игнорировать) это поведение, потому что в Python любой непустой объект non-null
оценивается как True, обрабатывается как логическое.
Для Например, все следующие будут печатать «True»
if [102]:
print "True"
else:
print "False"
if "anything that is not empty or None":
print "True"
else:
print "False"
if {1, 2, 3}:
print "True"
else:
print "False"
С другой стороны, все следующие будут печатать «False»
if []:
print "True"
else:
print "False"
if "":
print "True"
else:
print "False"
if set ([]):
print "True"
else:
print "False"
в зависимости от того, что вы хотите извлечь из таблицы, вот как вы можете играть с данными
numLines <- R.utils::countLines("sportsdb_sample_mysql_20080303.sql")
# [1] 81266
linesInDB <- readLines("sportsdb_sample_mysql_20080303.sql",n=60)
. Затем вы можете сделать некоторое регулярное выражение для получения имен таблиц (после CREATE TABLE), имена столбцов (между первыми скобками) и VALUES (строки после CREATE TABLE и между вторыми скобками)
EDIT: в ответ на ответ OP, если я правильно интерпретирую скрипт python, он также читает строку за строкой, фильтрует строки INSERT INTO, анализирует как csv, затем пишите в файл. Это очень похоже на мое первоначальное предложение. Моя версия ниже в R. Если размер файла слишком велик, было бы лучше прочитать в файле куски, используя другой R-пакет
options(stringsAsFactors=F)
library(utils)
library(stringi)
library(plyr)
mysqldumpfile <- "sportsdb_sample_mysql_20080303.sql"
allLines <- readLines(mysqldumpfile)
insertLines <- allLines[which(stri_detect_fixed(allLines, "INSERT INTO"))]
allwords <- data.frame(stri_extract_all_words(insertLines, " "))
d_ply(allwords, .(X3), function(x) {
#x <- split(allwords, allwords$X3)[["baseball_offensive_stats"]]
print(x[1,3])
#find where the header/data columns start and end
valuesCol <- which(x[1,]=="VALUES")
lastCols <- which(apply(x, 2, function(y) all(is.na(y))))
datLastCol <- head(c(lastCols, ncol(x)+1), 1) - 1
#format and prepare for write to file
df <- data.frame(x[,(valuesCol+1):datLastCol])
df <- setNames(df, x[1,4:(valuesCol-1)])
#type convert before writing to file otherwise its all strings
df[] <- apply(df, 2, type.convert)
#write to file
write.csv(df, paste0(x[1,3],".csv"), row.names=F)
})
Я не думаю, что вы найдете способ импортировать дамп sql (который содержит несколько таблиц со ссылками), а затем выполнить произвольные SQL-запросы на них в пределах R. Это в основном требовало, чтобы пакет R запускал полный сервер базы данных (совместимый с тем, который создает дамп) в пределах R.
Я бы предложил экспортировать таблицы / select утверждения, которые вам нужны в CSV из вашей базы данных (см. здесь) . Если вы можете работать только с дампа и не хотите настраивать сервер для преобразования, вы можете использовать некоторые простые регулярные выражения, чтобы превратить операторы insert
в ваш дамп в кучу CSV-файлов для таблиц, используя инструмент вы выбираете, как sed
или awk
(или даже R, как предложено другим ответом, но это может быть довольно медленным для этого размера файла).
Я неохотно отвечу на свой вопрос, используя вход из + bnord и + chinsoon12 (кто оба сделал кусочки головоломки).
Короткий ответ: нет решения из коробки. Как примечания + bnord, было бы желательно исправить его на стороне сервера (например, экспортируя в формат CSV с помощью mysqldump). Однако, как указывал мой вопрос, я ищу решение, которое позволяет мне работать с дампом sql, минуя сервер.
Итак, если нам нужно работать с дампом, как? Hardcore, ручной способ - использовать регулярные выражения для преобразования INSERT
в CSV, либо (1) вне R, используя sed
и awk
в текстовом файле .sql (+ bnord), либо (2) внутри R с grep
и gsub
в строках, загруженных с помощью readLines
(+ chinsoon12).
Некоторая хорошая душа написала скрипт python, который может конвертировать sql-дампы в CSV . Для этого требуется еще один кусок (потенциально нетривиальный для установки / поддержки) программного обеспечения, поэтому это не тот ответ, на который я надеялся, но он выглядит как хорошая модель, если кто-то хочет изобрести колесо в R.
На данный момент я придерживаюсь своего modus operandi (в Windows), на котором запущен MySQL Community Server, и используя WorkBench для импорта дампа, а затем поговорите с локальным сервером из R. Очень косвенный метод, который является болью в из-за непостижимой системы прав доступа MySQL (особенно раздражает, так как все это просто в текстовом файле ASCII), но единственный способ пока, похоже. Спасибо всем за ваш вклад!
(Если получится лучший, более полный ответ, я с радостью соглашусь с этим, если это возможно).