【问题标题】:read_delim of literal data after modifications to huge character vector修改大字符向量后的文字数据的 read_delim
【发布时间】:2018-09-20 19:13:29
【问题描述】:

我有一些用竖线分隔的文件,其中一些非常大(很多 GB),它们存在缺陷。有人错误地遗漏了一个字段和一个分隔符,但仅在某些行中。

我想使用read_lines 将每个文件作为字符串向量读取,然后应用count.fields(是否有此的tidyverse 版本?)将行拆分为两个字符串向量令牌。 (我必须删除其中一个向量中的最后一个字符串)。在所有这些操作之后,我想使用 read_delim 两次来解析具有不同数量分隔符的行集。我怎样才能欺骗read_delim 来读取每个字符串向量而不进行任何修改?还是我唯一的解决方案是编写新的临时文件然后使用read_delim

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

"paste" 可以添加换行符(如下所示),但为什么我需要这样做来欺骗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 有 tidyverse 版本吗?

【问题讨论】:

    标签: r tidyverse readr


    【解决方案1】:

    查看paste.c中的paste源代码,发现这两行

    如果 (pwidth > INT_MAX)
    error(_("结果将超过 2^31-1 个字节"));

    所以paste检查粘贴字符串的长度是否为&lt;= INT_MAX,如果不是则返回上述错误。

    R 有一个LONG_INT_MAX 和一个INT_MAX,后者是一个 32 位整数,因此可以有最大值 2^31 - 1(符号一位),对应大约 21 亿。

    paste(targetSet, collapse = "\n") 似乎超出了字符数限制。

    【讨论】:

      猜你喜欢
      • 2023-01-10
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多