R data.table fread命令:如何读取带有不规则分隔符的大文件?

fxi*_*fxi 4 r sed wc read.table data.table

我必须处理120个~2 GB(525600行×302列)文件的集合.目标是制作一些统计数据并将结果放在干净的SQLite数据库中.

当我的脚本使用read.table()导入时,一切正常,但速度很慢.所以我尝试使用fread,来自data.table包(版本1.9.2),但它给了我这个错误:

Error in fread(txt, header = T, select = c("YYY", "MM", "DD",  : 
Not positioned correctly after testing format of header row. ch=' '
Run Code Online (Sandbox Code Playgroud)

我的数据的前2行和7行看起来像这样:

 YYYY MM DD HH mm             19490             40790
 1991 10  1  1  0      1.046465E+00      1.568405E+00
Run Code Online (Sandbox Code Playgroud)

因此,开头有第一个空格,日期列之间只有一个空格,其他列之间有任意数量的空格.

我试过用这样的命令来转换逗号中的空格:

DT <- fread(
            paste("sed 's/\\s\\+/,/g'", txt),
            header=T,
            select=c('HHHH','MM','DD','HH')
)
Run Code Online (Sandbox Code Playgroud)

没有成功:问题仍然存在,使用sed命令似乎很慢.

Fread似乎不喜欢"任意数量的空间"作为分隔符或开头的空列.任何的想法 ?

这是(可能)最小的可重复示例(40790之后的换行符):

txt<-print(" YYYY MM DD HH mm             19490             40790
 1991 10  1  1  0      1.046465E+00      1.568405E+00")

testDT<-fread(txt,
              header=T,
              select=c("YYY","MM","DD","HH")
)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 !

更新: - data.table 1.8.*不会发生错误.在这个版本中,表被读作一个唯一的行,这并不是更好.

更新2 - 如评论中所述,我可以使用sed格式化表格然后用fread读取它.我在上面的答案中放了一个脚本,在那里我创建了一个样本数据集,然后比较一些system.time().

Aru*_*run 5

致力于发展,v1.9.5.fread()收益strip.white使用默认值参数TRUE(相反base::read.table(),因为它更合乎需要).现在,示例数据已添加到测试中.

通过最近的提交:

require(data.table) # v1.9.5, commit 0e7a835 or more recent
ans <- fread(" YYYY MM DD HH mm             19490             40790\n   1991 10  1  1  0      1.046465E+00      1.568405E+00")
#      V1 V2 V3 V4 V5           V6           V7
# 1: YYYY MM DD HH mm 19490.000000 40790.000000
# 2: 1991 10  1  1  0     1.046465     1.568405
sapply(ans, class)
#          V1          V2          V3          V4          V5          V6          V7 
# "character" "character" "character" "character" "character"   "numeric"   "numeric" 
Run Code Online (Sandbox Code Playgroud)