使用read.csv()读取csv文件时出现“在输入中发现嵌入的空值(embedded nul(s) found in input)”错误。

51

我正在阅读一个 csv 文件。

代码如下:

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

收到以下警告:

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

现在我的CSV文件中有一些单元格包含用 "" 表示的缺失值。

我该如何编写代码才能避免上述警告?


2
这个opencsv的bug报告:http://sourceforge.net/p/opencsv/bugs/96/ 看起来是否可能导致你的CSV文件出现了null值?如果不是这个问题,而你正在使用Linux系统,那么tr -d '\000' < filein > fileout将会移除这些null值,但这可能并不能完全解决你的问题。 - hrbrmstr
嗯,我来看看...找得不错。 - user1172468
7个回答

61

你的CSV文件可能是使用UTF-16编码的。当使用一些基于Windows的工具时,这种情况并不罕见。

你可以尝试像这样加载UTF-16编码的CSV文件:

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

谢谢,但那并没有解决问题... 我很确定我没有处理一个UTF-16LE文件。 - user1172468
@user1172468:你试过用十六进制编辑器查看文件吗?可能有嵌入的空字符。你的CSV文件是用什么程序生成的? - nneonneo
我收到了以下警告信息: 1:在输入连接“mycsv.csv”上发现无效输入。 2:在“mycsv.csv”上,readTableHeader 发现不完整的最终行。 - user1172468
我使用Java中的opencsv生成了它 - 我非常有信心文件中没有utf-16字符 - 但我可能是错的。 - user1172468
我不知道什么是“UTF-16LE”,但它帮了我很大的忙!! - Outlier

41

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

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

来自?read.csv

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

这对我有用。


@Richard,@Apex或其他人,请指引我到一个资源,或者1)定义“嵌入式空值”,2)更详细地解释skipNul = TRUE的作用?谢谢。 - Daniel Fletcher
空值是ASCII值为 0(Hx0)的字符,通常称为NULnull(可以查看任何ASCII表)。一个(修改或转换后的)字符串中可以包含这些字符。有时它们被渲染为\0,例如ABC\0EFG。如果SkipNul = TRUE,则会忽略它们。 - Enzo
@Enzo 感谢您的反馈。我推断 R 认为嵌入式空值应该变成 NA;然而,由于 na.strings = <input> 的参数不清楚或不足以将所有嵌入式空值转换为 NA,因此 R 将剩余的作为文本字符串保留其源值。是这样吗?如果是这样,有没有办法确定 R 忽略了哪些数据点作为嵌入式空值?(目标是将它们转换为 NA。)再次感谢。 - Daniel Fletcher
在我的情况下(机器的输出),skipNul很好。 - JASC
但是由于另一台机器的输出,我不得不使用UTF-16LE编码。 - JASC

4

这与编码无关,而是文件中null的读取问题。为了处理这个问题,你需要传递skipNul = TRUE参数。

例如:

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


2

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

如果是这样,请尝试通过awk运行该文件:

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

1

另一个快速解决方案:

仔细确认您确实正在读取 .csv 文件!

我不小心读取了一个 .rds 文件而不是 .csv,导致出现“嵌入式空值”错误。


1
我遇到了相同的错误信息,后来发现尽管我的文件扩展名为.csv,并且在电子表格中没有问题地打开,但它们实际上是以“所有格式”而不是“文本CSV (.csv)”保存的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接