如何在R中使用readLines读取某个范围内的所有行?

Fra*_*ank 4 r readlines jsonlite

我正在尝试将大型 JSONL(.gz) 文件拆分为多个 .csv 文件。我已经能够使用下面的代码为前 25.000 个条目创建一个有效的 .csv 文件。我现在想读取和解析 25.001 到第 50.000 行,但一直无法这样做。我觉得这应该很容易完成,但到目前为止我的搜索没有结果。

有没有办法操纵 readLines 函数中的“n”因子来选择特定范围的行?

(ps我正在学习;))

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)
Run Code Online (Sandbox Code Playgroud)

Len*_*ski 5

包中的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) 
Run Code Online (Sandbox Code Playgroud)

这是一个使用 NOAA StormData 数据集的完整工作示例。该文件描述了 1950 年至 2011 年间美国超过 900,000 次极端天气事件的位置、事件类型和损害信息。我们将readr::read_lines()在下载并解压缩文件后以 25,000 为一组读取前 50,000 行。

警告:zip 文件大约为 50Mb。

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)
Run Code Online (Sandbox Code Playgroud)

...以及在 RStudio 环境查看器中查看的对象:

在此处输入图片说明

下面是性能定时比较base::readLines()readr::read_lines()在HP克特X-360的笔记本电脑与英特尔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 
Run Code Online (Sandbox Code Playgroud)