R data.table fread 命令 : how to read large files with irregular separators?

标签 r sed data.table read.table wc

我必须处理大约 2 GB(525600 行 x 302 列)的 120 个文件的集合。目标是进行一些统计并将结果放入干净的 SQLite 数据库中。

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

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

我的数据的前 2 行和 7 行如下所示:
 YYYY MM DD HH mm             19490             40790
 1991 10  1  1  0      1.046465E+00      1.568405E+00

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

我尝试使用这样的命令来转换逗号中的空格:
DT <- fread(
            paste("sed 's/\\s\\+/,/g'", txt),
            header=T,
            select=c('HHHH','MM','DD','HH')
)

没有成功:问题仍然存在,使用 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")
)

谢谢你的帮助 !

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

更新 2
- 正如评论中提到的,我可以使用 sed 来格式化表格,然后使用 fread 读取它。我在上面的答案中放置了一个脚本,我在其中创建了一个示例数据集,然后比较了一些 system.time()。

最佳答案

Just committed开发,v1.9.5。 fread() yield 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" 

关于R data.table fread 命令 : how to read large files with irregular separators?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22229109/

相关文章:

r - 在 R : merging zip code shapefiles from multiple states 中制作等值线

r - 条形图 R 中的颜色

r - 如何在R中简洁地表达这个和?

python - 替换列表中字符串中的字符并为每个字符创建一个副本

sed - 使用 sed 命令替换两行之间的字符串

r - 如何根据时间戳列制作时间跨度列?

r - 在 ggplot 中过滤管道 df

bash - 将文本附加到文件 bash 中的特定行

r - 比较 R data.table 中多列值的向量

r - 将一个 R 数据表中的列添加到另一个