Проблема в том, что sqldf предоставляет средства предварительной обработки текста, но код, показанный в вопросе, не использует их, что делает его слишком сложным.
1) Что касается подстановки текста, используйте fn$
(из gsubfn, который автоматически загружает sqldf), как обсуждалось на странице github для sqldf .Предполагая, что мы использовали quote = FALSE в файле write.csv, поскольку sqlite не обрабатывает кавычки изначально:
spec <- 'setosa'
out <- fn$read.csv.sql("iris.csv", "select * from file where Species = '$spec' ")
spec <- c("setosa", "versicolor")
string <- toString(sprintf("'%s'", spec)) # add quotes and make comma-separated
out <- fn$read.csv.sql("iris.csv", "select * from file where Species in ($string) ")
2) Что касается удаления двойных кавычек, более простым способом было бы использоватьследующий filter=
аргумент:
read.csv.sql("iris.csv", filter = "tr -d \\042") # Windows
или
read.csv.sql("iris.csv", filter = "tr -d \\\\042") # Linux / bash
в зависимости от вашей оболочки.Первый работал для меня в Windows (с установленным Rtools и в PATH), а второй работал для меня в Linux с bash.Возможно, что для других оболочек могут потребоваться другие варианты.
2a) Другая возможность удаления кавычек - установить бесплатную утилиту csvfix (доступна в Windows , Linux и Mac ) в вашей системе, а затем используйте следующий аргумент filter=
, который должен работать во всех оболочках, поскольку он не включает никаких символов, которые обычно интерпретируются R или Rбольшинство снарядов.Таким образом, следующее должно работать на всех платформах.
read.csv.sql("iris.csv", filter = "csvfix echo -smq")
2b) Еще одна кроссплатформенная утилита, которую можно использовать: xsv .Аргумент eol=
необходим только в Windows, поскольку xsv
создает окончания строк в стиле UNIX, но не повредит на других платформах, поэтому следующая строка должна работать на всех платформах.
read.csv.sql("iris.csv", eol = "\n", filter = "xsv fmt")
2c) sqldf также включает в себя программу awk (csv.awk), которую можно использовать.Он выводит символы новой строки в стиле UNIX, поэтому укажите в Windows eol = "\ n".На других платформах это не повредит, если вы укажете это, но вы можете опустить его, если хотите, так как это значение по умолчанию на этих платформах.
csv.awk <- system.file("csv.awk", package = "sqldf")
rm_quotes_cmd <- sprintf('gawk -f "%s"', csv.awk)
read.csv.sql("iris.csv", eol = "\n", filter = rm_quotes_cmd)
3) Что касается общих советов,обратите внимание, что аргумент verbose=TRUE
для read.csv.sql
может быть полезен для просмотра происходящего.
read.csv.sql("iris.csv", verbose = TRUE)