【问题标题】:read csv +unicode in R在 R 中读取 csv + unicode
【发布时间】:2015-03-27 23:43:04
【问题描述】:

我遇到了与here 中的解释相同的问题,唯一的区别是 CSV 文件包含 non_english 字符串,我找不到任何解决方案: 当我读取未编码的 csv 文件时,它没有给我任何错误,但数据更改为:

network=read.csv("graph1.csv",header=TRUE)

  اشپیل(60*4)

如果我用fileEncoding 运行read.csv,它会给我这个错误:

 network=read.csv("graph1.csv",fileEncoding="UTF-8",header=TRUE)
Warning messages:
1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  invalid input found on input connection 'graph1.csv'
2: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  incomplete final line found by readTableHeader on 'graph1.csv'

 network[1]
[1] X.
<0 rows> (or 0-length row.names)

系统信息:

windows server 2008
R:R3.1.2

示例文件:

node1,node2,weight
ورق800*750*6,ورق 1350*1230*6mm,0.600000024
ورق900*1200*6,ورق 1350*1230*6mm,0.600000024
ورق76*173,ورق 1350*1230*6mm,0.600000024
ورق76*345,ورق 1350*1230*6mm,0.600000024
ورق800*200*4,ورق 1350*1230*6mm,0.600000024

【问题讨论】:

  • 它只是整个文件没有正确读取的列名。
  • 第二个警告应该根据我的回答解决,因为你忘记了回车。
  • 对于它的价值,示例文件在 Mac 上完美运行(假设系统区域设置为 UTF-8),并且两个代码 sn-ps 工作 - 这几乎肯定是一个特定于 Windows 的问题,因为 Windows 下 R 下的 Unicode 支持非常简陋。
  • 您应该通过在末尾放置 EOD 分隔符来获得以下结果(我也称为回车)

标签: r csv encoding


【解决方案1】:

我试过你的输入:

> read.csv("graph1.csv", encoding="UTF-8")
                      X.U.FEFF.node1                                  node2 weight
1  <U+0648><U+0631><U+0642>800*750*6 <U+0648><U+0631><U+0642> 1350*1230*6mm    0.6
2 <U+0648><U+0631><U+0642>900*1200*6 <U+0648><U+0631><U+0642> 1350*1230*6mm    0.6
3     <U+0648><U+0631><U+0642>76*173 <U+0648><U+0631><U+0642> 1350*1230*6mm    0.6
4     <U+0648><U+0631><U+0642>76*345 <U+0648><U+0631><U+0642> 1350*1230*6mm    0.6
5  <U+0648><U+0631><U+0642>800*200*4 <U+0648><U+0631><U+0642> 1350*1230*6mm    0.6

【讨论】:

  • 感谢您的回答,但它仍然给了我警告 Warning message: In read.table(file = file, header = header, sep = sep, quote = quote, : invalid input found on input connection 'graph1.csv'. 并且第二个警告已解决,它现在只是读取头文件。 [1] node1 node2 weight &lt;0 rows&gt; (or 0-length row.names)
  • 你能提供你的文件样本吗?
  • 第一个代码的输出看起来不像是 UTF-8 BOM。
  • @ColonelBeauvel 我在问题中添加了一些数据。
  • @ColonelBeauvel,谢谢。是的,没有文件编码,文件会按照你提到的方式读取
【解决方案2】:

以下应该可以工作——请注意,我无法测试它,因为我没有 Windows(而且 Windows、Unicode 和 R 根本不混合):

x = read.csv('graph1.csv', fileEncoding = '', stringsAsFactors = TRUE)

此时,x 是乱码,因为它是按原样读取的,没有将字节数据解析为编码。我们应该能够验证这一点:

Encoding(x[1, 1])
# [1] "unknown"

现在我们告诉 R 将其视为 UTF-8:

x = as.data.frame(lapply(x, iconv, from = 'UTF-8', to = 'UTF-8),
                  stringsAsFactors = FALSE)

这两个步骤可以通过使用encoding 而不是fileEncoding 作为read.csv 的参数来压缩为一个:

x = read.csv('graph1.csv', encoding = 'UTF-8', stringsAsFactors = TRUE)

在任何一种情况下,都会发生大致相同的过程。

此时,x 仍然 显示为乱码,因为您在 Windows 上的终端可能不支持 R 理解的 Unicode 代码页。事实上,在 Mac 上使用非 UTF-8 代码页运行代码时,我现在得到以下输出:

x[1, 1]
# [1] "<U+0648><U+0631><U+0642>800*750*6"

但是,至少现在正确设置了编码,并且解析了字节:

Encoding(x[1, 1])
# [1] "UTF-8"

如果您将数据传递给使用 UTF-8 的设备或程序,它应该会正确显示。例如,在plot 命令中使用数据作为标签应该可以工作。

plot.new()
text(0.5, seq(0, 1, along.with = x[, 1]), x[, 1])

【讨论】:

  • 感谢您的解释,但经过一些分析,我需要将数据写回 csv ,但现在我只需在x = read.csv('graph1.csv', encoding = 'UTF-8', stringsAsFactors = TRUE) 之后写入文件。我将按原样输出,而不是编码真实数据。
  • @academic.user 不幸的是,此时我无法访问 Windows,这使我无法尝试可行的方法。但是你试过只写文件吗?数据根本没有改变,所以这可能有效。
  • 。谢谢,是的,我在network=read.csv("graph1.csv", encoding="UTF-8", header=TRUE) 之后尝试了write.csv(network, file = "network.csv",row.names=FALSE),输出为:"X.U.FEFF.node1","node2","weight" "&lt;U+0648&gt;&lt;U+0631&gt;&lt;U+0642&gt;800*750*6","&lt;U+0648&gt;&lt;U+0631&gt;&lt;U+0642&gt; 1350*1230*6mm",0.600000024 "&lt;U+0648&gt;&lt;U+0631&gt;&lt;U+0642&gt;900*1200*6","&lt;U+0648&gt;&lt;U+0631&gt;&lt;U+0642&gt; 1350*1230*6mm",0.600000024
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多