【发布时间】:2018-12-18 07:09:24
【问题描述】:
我有一个巨大的字符向量数据集(14GB,2 亿行)。我很害怕(在 48 核 128 GB 服务器上花了 > 30 分钟)。该字符串包含有关各个字段的串联信息。例如,我的表格的第一行如下所示:
2014120900000001091500bbbbcompany_name00032401
其中前 8 个字符代表 YYYYMMDD 格式的 date,接下来的 8 个字符是 id,接下来的 6 个字符是 HHMMSS 格式的 time,接下来的 16 个字符是 name(以 b 为前缀),最后 8 个字符是price(小数点后两位)。
我需要把上面的1列data.table转成5列:date, id, time, name, price。
对于上面的字符向量,结果是:date = "2014-12-09", id = 1, time = "09:15:00", name = "company_name", price = 324.01
我正在寻找一个(非常)快速高效的 dplyr / data.table 解决方案。现在我正在使用substr:
date = as.Date(substr(d, 1, 8), "%Y%m%d");
它需要永远执行!
更新:使用
readr::read_fwf我可以在 5-10 分钟内读取文件。显然,阅读速度比fread快。下面是代码:
f = "file_name";
num_cols = 5;
col_widths = c(8,8,6,16,8);
col_classes = "ciccn";
col_names = c("date", "id", "time", "name", "price");
# takes 5-10 mins
data = readr::read_fwf(file = f, col_positions = readr::fwf_widths(col_widths, col_names), col_types = col_classes, progress = T);
setDT(data);
# object.size(data) / 2^30; # 17.5 GB
【问题讨论】:
-
你试过read.fwf直接把固定的子串读入不同的列吗?
-
@Henrik 感谢您的指出。我不知道固定宽度读数(这正是我想要的)。
标签: arrays r data.table