【问题标题】:'Embedded nul in string' error when importing csv with fread使用 fread 导入 csv 时出现“在字符串中嵌入 nul”错误
【发布时间】:2014-05-03 19:33:25
【问题描述】:

我有一个大文件 (3.5G),我正在尝试使用 data.table::fread 导入。

它最初是从以文本形式打开并保存为 CSV 的 rpt 文件创建的。

这适用于较小的文件(具有相同类型的数据-相同的列和所有文件。这个只是用于更长的时间范围和更广泛的覆盖范围)。

当我尝试运行时

mydata <- fread("mycsv.csv")

我得到错误:

fread("mycsv.csv") 中的错误:在字符串中嵌入 nul:'y\0e\0a\0r\0'

这是什么意思?

【问题讨论】:

  • 它看起来像 UTF-16(每个字符 2 个或更多字节,几乎总是 2 个字节)。对于 ASCII,您将看到 ASCII 值,然后是 0 字节。
  • 我在加载从大型数据集生成的 RData 文件时遇到了同样的问题。我重新生成 RData,问题就消失了。似乎是我的 RAM 用尽时造成的。
  • 当您尝试使用fread 不恰当地打开 RDS 文件时,也会出现此错误。不要问我怎么知道的。

标签: r data.table fread


【解决方案1】:

我们可以使用以下方式删除命令行中的空终止符:

sed 's/\\0//g' mycsv.csv > mycsv.csv

或者正如@marbel 所建议的那样,fread 允许您在文本中传递 sed 调用。如:

fread("sed 's/\\0//g' mycsv.csv")

【讨论】:

  • 感谢您的回复。我不确定如何在 R 中输入它。我意识到,显然,错误告诉我嵌入的 nul 在字符串“year”中,这是 csv 第一行的第一个单词(它是第一列标题)。完整的错误是 [ Error in fread("allpcts90days1.csv") : embedded nul in string: 'y\0e\0a\0r\0'] 知道这告诉我什么吗?当我在文本编辑器(TextPad 或 UltraEdit,因为它们可以处理这种大小的文件)中查看文本时,我没有看到任何异常。
  • 您的文本文件包含在 ASCII 中保留用于终止字符串的字符。你需要从 linux 命令行运行它,或者如果你在 Windows 上,谷歌“如何从文件窗口中删除特殊字符”。
  • fread 允许您在文本中传递 sed 调用。如:fread("sed 's/\\0//g' mycsv.csv")
  • 它说:'sed' is not recognized as an internal or external command,此外我收到“空文件错误”
  • 我认为sep 可能是@RobertKrzyzanowski 提到的论点?
【解决方案2】:

在这种情况下,您可以将 read.csv 与 UTF-16LE 的文件编码一起使用,而不是 fread

read.csv("mycsv.csv",fileEncoding="UTF-16LE")

考虑到您的数据大小,使用read.csv 需要几分钟,但我认为这没什么大不了的。

【讨论】:

  • 数据量这么大,其实可以接近一个小时。
  • 根据我的经验,加载 3.5GB 数据几乎不会超过 15 分钟,除非在一些非常极端的情况下。
  • @FanWang 取决于列类型
【解决方案3】:

你可以测试这个小功能:

cleanFiles<-function(file,newfile){
  writeLines(iconv(readLines(file,skipNul = TRUE)),newfile)
}

这对我有用

【讨论】:

    【解决方案4】:

    解决这个问题的非技术方法是,

    1. 打开有问题的.csv

    2. Ctrl+A(全选)

    3. 打开新的 Excel 工作表

    4. 右键单击并选择“粘贴为值”

    5. 保存并使用此文件代替原始文件。

    为我工作,不需要太多时间。

    【讨论】:

      【解决方案5】:

      如果您在 ASCII 文件中看到 NUL (x00) 字符,您可以这样做: data.table::fread(text = readLines(pathIn, skipNul = T), ...)

      【讨论】:

        【解决方案6】:

        我遇到了类似的错误,分享以防其他人遇到同样的问题 -

          embedded nul in string: '\0HA\xa8S\001\0\0\0\xd8@\xa8S\001\0\0\0h@\xa8S\001\0\0\0\xf8?\xa8S\001\0\0\0\x88'
        Calls: as.data.table -> fread
        

        这最终的原因是我的第一列(标题)比其他列短。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-12
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-19
          • 2020-03-02
          相关资源
          最近更新 更多