2015-11-24 2 views
0

У меня есть данные, что выглядит примерно так:Использования sqldf данных с сноской

myDat <- data.frame(V1=rnorm(1000), 
        V2=sample(LETTERS, 1000, replace=TRUE), 
        V3=sample(1:1000, 1000)) 
write.table(myDat, file="myData.txt", sep="|", quote=FALSE, col.names=FALSE, row.names=FALSE) 
write("00001000 RECORDS", file="myData.txt", append=TRUE) # This is the annoying footer 

Примечание колонтитула в нижней части, что всегда есть .. Я хотел бы, чтобы прочитать его в sqldf. Что-то вроде этого:

f <- file("myData.txt") 
hkFile <- sqldf("SELECT * FROM f", dbname=tempfile(), 
       file.format=list(header=FALSE, sep="|", eol="\n")) 

Я получаю эту ошибку из футера, приложенного к данным:

Error in .local(conn, name, value, ...) : 
    RS_sqlite_import: myData.txt line 1001 expected 3 columns of data but found 1 

есть простой способ обойти сноску? Копирование данных во временный файл не является вариантом, так как некоторые из моих наборов данных ~ 6 ГБ

ответ

1

Просто потому, что файл большой, не обязательно означает, что вы не могли его скопировать.

Это будет сделано, но оно будет прозрачно копировать файл.

my <- read.csv.sql("myData.txt", sql = "select * from file", sep = "|", 
    header = FALSE, filter = "head -n -1") 

В Windows предполагается, что установлен Rtools и в этом случае, как правило, будет в состоянии найти head но если не дать путь, например, filter = "C:/Rtools/bin/head -n - 1". Если на Linux тогда head должен быть уже доступен.

+0

Это сработало, спасибо! Не могли бы вы рассказать о том, что вы подразумеваете под «прозрачной копией» и тем, что там происходит? – panterasBox

+0

Он будет запускать входной файл через 'head -n-1', создавая временный файл, а затем читать это временное значение, чтобы была сделана копия. Попробуйте добавить 'verbose = TRUE' к аргументам' read.csv.sql', чтобы увидеть подробности. –

Смежные вопросы