Как использовать readLines в R, чтобы прочитать все строки между определенным диапазоном? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь разбить большой файл JSONL (.gz) на несколько файлов .csv. Я смог использовать приведенный ниже код для создания рабочего файла .csv, для первых 25 000 записей. Теперь я хочу прочитать и разобрать 25.001 до 50.000-й строки, и я не смог этого сделать. Я чувствую, что это должно быть легко сделано, но мои поиски до сих пор были бесплодными.

Есть ли способ манипулировать фактором 'n' в функции readLiness для выбора определенного диапазона строк?

(с. Учусь;))

setwd("filename")

a<-list.files(pattern="(.*?).0.jsonl.gz")
a[1]

raw.data<- readLines(gzfile(a[1]), warn = "T",n=25000) 
rd <- fromJSON(paste("[",paste(raw.data,collapse=','),']'))
rd2<-do.call("cbind", rd) 

file=paste0(a,".csv.gz") 
write.csv.gz(rd2, file, na="", row.names=FALSE)

1 Ответ

0 голосов
/ 04 сентября 2018

Функция read_lines() в пакете readr быстрее, чем base::readLines(), и может использоваться для указания начальной и конечной строки для чтения. Например:

library(readr)
myFile <- "./data/veryLargeFile.txt"

first25K <- read_lines(myFile,skip=0,n_max = 25000)

second25K <- read_lines(myFile,skip=25000,n_max=25000) 

Вот полный рабочий пример использования набора данных NOAA StormData. Файл описывает местоположение, тип события и информацию о повреждениях для более чем 900 000 экстремальных погодных явлений в Соединенных Штатах в период с 1950 по 2011 год. Мы будем использовать readr::read_lines() для чтения первых 50 000 строк в группах по 25 000 после загрузки и разархивирования файла.

Предупреждение: размер zip-файла составляет около 50 МБ.

library(R.utils) 
library(readr)
dlMethod <- "curl"
if(substr(Sys.getenv("OS"),1,7) == "Windows") dlMethod <- "wininet"
url <- "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2"
download.file(url,destfile='StormData.csv.bz2',method=dlMethod,mode="wb")
bunzip2("StormData.csv.bz2","StormData.csv")

first25K <- read_lines("StormData.csv",skip=0,n_max = 25000)

second25K <- read_lines("StormData.csv",skip=25000,n_max=25000)

... и объекты, просматриваемые в средстве просмотра среды RStudio:

enter image description here

Вот временные характеристики производительности, сравнивающие base::readLines() с readr::read_lines() на ноутбуке HP Spectre x-360 с процессором Intel i7-6500U.

> # check performance of readLines()
> system.time(first25K <- readLines("stormData.csv",n=25000))
   user  system elapsed 
   0.05    0.00    0.04 
> # check performance of readr::read_lines()
> system.time(first25K <- read_lines("StormData.csv",skip=0,n_max = 25000))
   user  system elapsed 
   0.00    0.00    0.01 
...