我遇到与here中的解释相同的问题,唯一的区别是CSV文件包含non_english字符串,我无法找到任何解决方案: 当我读取带有编码的csv文件时,它没有给出错误,但数据更改为:
network=read.csv("graph1.csv",header=TRUE)
اشپیل(60*4)
如果我使用read.csv
运行fileEncoding
,则会出现此错误:
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
答案 0 :(得分:2)
我尝试了你的输入:
> 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
答案 1 :(得分: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])