Как найти UNIX раз, соответствующих определенной дате, в очень большом файле в R - PullRequest
1 голос
/ 09 февраля 2020

У меня есть очень большой (10 миллионов строк x 12 столбцов) текстовый файл с разделителями-запятыми. Первый столбец содержит UNIX раз (в секундах до 2 dp)

Я хотел бы извлечь все строки, соответствующие определенной дате (например, 2014-06-26), и сохранить строки для каждой даты в другие файлы меньшего размера.

В приведенном ниже документе я сканирую файл, читая первое число в каждой строке (время), и выкладываю номер строки всякий раз, когда дата, связанная с текущей строкой, отличается от предыдущей row:


## create fake data ; there are many duplicate times, rows are not always in order
con <- "BigFile.txt"; rile.remove(con)
Times <- seq ( 1581259391,  1581259391 + (7*24*3600), by=100)
write.table(data.frame(Time=Times, x=runif(n = length(Times))), file=con, sep=",", row.names=F, col.names=F, append=F)

## read in fake data line-by-line, note
con <- file( "BigFile.txt", open="r")
Row      <- 0
Now    <- 0
Last   <- 0
while (length(myLine <- scan(con,what="numeric",nlines=1,sep=',',skip=1,quiet=TRUE)) > 0 )
  {Row <- Row+1
  Now <- as.Date(as.POSIXct( as.numeric(myLine[1]), origin="1970-01-01", tz="GMT" )  , format="%Y-%m-%d")
  if (Now!=Last) {print(data.frame(Row,Now))}
  Last <- Now
  } 

Идея будет заключаться в том, чтобы сохранить эти индексы и использовать их для разбиения файла на более мелкие ежедневные порции ... Однако я уверен, что должны быть гораздо более эффективные подходы (я попытался открыть эти файлы с помощью пакета data.table, но все еще сталкивается с проблемами с памятью).

Любые указатели будут с благодарностью.

1 Ответ

2 голосов
/ 09 февраля 2020
library(sqldf)

# data
con <- "BigFile.txt"
Times <- seq ( 1581259391,  1581259391 + (7*24*3600), by=100)
write.table(data.frame(Time=Times, x=runif(n = length(Times))), file=con, sep=",", row.names=F, col.names=F, append=F)

# solution
df <- read.csv.sql("BigFile.txt", header = F,
                      sql = "select * from file where V1 = 1403740800", eol = "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...