【问题标题】:Get "embedded nul(s) found in input" when reading a csv using read.csv()使用 read.csv() 读取 csv 时获取“在输入中找到的嵌入式 nul(s)”
【发布时间】:2014-04-22 02:42:54
【问题描述】:

我正在阅读一个 csv 文件。

代码是:

mydata = read.csv("mycsv.csv", header=True, sep=",", quote="\"")

收到以下警告:

警告信息: 在scan(file = file, what = what, sep = sep, quote = quote, dec = dec,: 在输入中发现嵌入的 nul(s)

现在我的 CSV 中的某些单元格缺少由“”表示的值。

如何编写此代码,以免收到上述警告?

【问题讨论】:

  • 此 opencsv 错误报告是否:sourceforge.net/p/opencsv/bugs/96:看起来可能导致您的 CSV 文件包含空值?如果不是这样,并且您使用的是 Linux 系统,tr -d '\000' < filein > fileout 将删除空值,但这可能无法完全解决您的问题。
  • MMMmm 我会检查...很好的发现

标签: r


【解决方案1】:

您的 CSV 可能以 UTF-16 编码。在使用一些基于 Windows 的工具时,这种情况并不少见。

您可以尝试像这样加载 UTF-16 CSV:

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

【讨论】:

  • 谢谢,但没有归档...我很确定我不是在处理 UTF-16LE 文件
  • @user1172468:您是否尝试过在 hexeditor 中查看文件?我猜可能有嵌入的 NUL。什么程序生成了您的 CSV?
  • 我收到以下信息:警告消息:1:在 read.table(file = file, header = header, sep = sep, quote = quote, : 在输入连接 'mycsv.csv 上找到无效输入' 2: 在 read.table(file = file, header = header, sep = sep, quote = quote, : readTableHeader 在 'mycsv.csv' 上找到的最后一行不完整
  • 我在 Java 中使用 opencsv 生成了它——我非常确信文件中没有 utf-16 字符——但我总是会出错
  • 我不知道什么是“UTF-16LE”,但它帮助了我!!
【解决方案2】:

您可以尝试使用skipNul = TRUE 选项。

mydata = read.csv("mycsv.csv", quote = "\"", skipNul = TRUE)

来自?read.csv

输入流中嵌入的 nuls 将终止当前正在读取的字段,并在每次调用扫描时发出一次警告。设置 skipNul = TRUE 会导致它们被忽略。

它对我有用。

【讨论】:

  • @Richard、@Apex 或其他人,请您指点我的资源或 1) 定义“嵌入式 nul”和 2) 更详细地解释 skipNul = TRUE 的作用?谢谢。
  • Null 是 ASCII 值 0 (Hx0),称为 NULnull(检查任何 ASCII 表)。 (操纵或转换的)字符串可以包含这些字符。有时它们会呈现为\0,如ABC\0EFG。 SkipNul = TRUE 忽略它们。
  • @Enzo 感谢您的反馈。我在推断 R 认为嵌入的空值应该变成 NAs;但是,由于na.strings = <input> 的参数不清楚或不足以将所有 嵌入的空值转换为NAs,R 将余数保留为带有源值的文本字符串。正确的?如果是这样,有没有办法确定哪些数据点 R 被忽略为嵌入的空值? (目标是将它们转换为NAs。)再次感谢。
  • 就我而言(机器的输出)skipNul 很好。
  • 但是用另一台机器的输出,我不得不使用UTF-16LE编码。
【解决方案3】:

这与编码无关。这是读取文件中的空值的问题。为此,您需要传递 skipNul = TRUE 参数。

例如:

neg = scan('F:/Natural_Language_Processing/negative-words.txt', what = 'character', comment.char = '', encoding = "UTF-8", skipNul = TRUE)

【讨论】:

    【解决方案4】:

    可能是没有 CRLF 的文件,可能只有 LF。尝试检查文件的 HEX 输出。

    如果是这样。尝试通过 awk 运行文件:

    awk '{printf "%s\r\n", $0}' file > new_log_file
    

    【讨论】:

      【解决方案5】:

      我收到了同样的错误消息,并发现虽然我的文件具有 .csv 扩展名并且在电子表格中打开时没有问题,但它们实际上保存为“所有格式”而不是“文本 CSV (.csv)”

      【讨论】:

        【解决方案6】:

        在这些情况下,请确保您正在导入的数据没有“#”字符,但如果是这种情况,请尝试使用选项 comment.char=""。它对我有用。

        【讨论】:

          【解决方案7】:

          另一个快速解决方案:

          仔细检查您是否确实在阅读 .csv 文件!

          我不小心读取了 .rds 文件而不是 .csv 并得到了这个“嵌入式空”错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-19
            • 2014-05-03
            • 1970-01-01
            • 1970-01-01
            • 2019-07-23
            • 1970-01-01
            • 1970-01-01
            • 2018-03-21
            相关资源
            最近更新 更多