修改巨大字符向量后的文字数据的read_delim

时间:2018-04-11 03:20:09

标签: r tidyverse readr

我有一些管道分隔的文件,一些非常大(许多GB),有缺陷。有人错误地遗漏了一个字段和一个分隔符,但仅限于某些行。

我想使用read_lines将每个文件作为字符串向量读取,然后应用count.fields(这是否有一个tidyverse版本?)将行分成两个字符串向量按令牌数量。 (我必须删除其中一个向量中的最后一个字符串)。在完成所有操作之后,我想使用read_delim两次来解析具有不同数量的分隔符的行集。如何在没有任何修改的情况下欺骗read_delim来读取每个字符串向量?或者是我编写新临时文件然后使用read_delim

的唯一解决方案

read_delim的在线帮助说:“文件”可以是文字,但“必须包含至少一个新行才能被识别为数据(而不是路径)。”

“粘贴”可以添加换行符(如下所示),但为什么我需要这样做来欺骗read_delim来读取文字数据而不是路径?为什么不向read_delim添加一个参数,以便以字符串向量的形式读取文字数据?

我想传递targetSet字符串向量,但read_delim需要换行符:

 d <- read_delim(paste(targetSet, collapse="\n"), delim="|",
                  col_types=cols(.default="c"))

这适用于具有100,000条记录的文件,但粘贴失败,其中一个文件大约有1.6亿条记录:

  

粘贴错误(targetSet,collapse =“\ n”):结果会超出   2 ^ 31-1个字节

我使用的是64位R,所以我不明白这个消息。我正在使用的Linux机器上应该有几十GB的内存。

是否有一个技巧让read_delim从read_lines读取修改后的字符串向量?是否有textConnection的整齐版本?

1 个答案:

答案 0 :(得分:1)

看一下console中的paste源代码,我们找到两行

  

if(pwidth&gt; INT_MAX)
     错误(_(&#34;结果将超过2 ^ 31-1个字节&#34;));

所以paste.c检查粘贴的字符串的长度是否为paste,如果不是则返回错误。

R有一个<= INT_MAX和一个LONG_INT_MAX,后者是一个32位整数,因此可以有一个最大值INT_MAX(符号一位),对应于21亿。

似乎2^31 - 1超出了字符数限制。