У меня та же проблема, что и в здесь, с той лишь разницей, что CSV-файл содержит не_английскую строку, и я не смог найти для нее решения: когда я читаю файл 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
3
academic.user 29 Янв 2015 в 00:46
Возможный дубликат имен столбцов не читается правильно read.csv в R
 – 
Colonel Beauvel
29 Янв 2015 в 00:52
Это просто не имя столбца, весь файл не читается должным образом.
 – 
academic.user
29 Янв 2015 в 01:02
Второе предупреждение должно быть решено в соответствии с моим ответом из-за возврата каретки, которую вы забыли.
 – 
Colonel Beauvel
29 Янв 2015 в 01:06
Что бы это ни стоило, файл примера отлично работает на Mac (при условии, что языковой стандарт системы установлен на UTF-8), и оба фрагмента кода работают — это почти наверняка проблема, специфичная для Windows, потому что поддержка Unicode в R для Windows довольно откровенно хиленький.
 – 
Konrad Rudolph
29 Янв 2015 в 01:11
Вы должны получить следующий результат, поставив в конце разделитель EOD (то, что я также назвал возвратом каретки)
 – 
Colonel Beauvel
29 Янв 2015 в 01:18

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
2
Colonel Beauvel 29 Янв 2015 в 01:27
Спасибо за ваш ответ, но все же он дает мне предупреждение 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 <0 rows> (or 0-length row.names)
 – 
academic.user
29 Янв 2015 в 00:58
Можете ли вы дать образец вашего файла?
 – 
Colonel Beauvel
29 Янв 2015 в 01:01
Вывод из первого кода не похож на спецификацию UTF-8.
 – 
Konrad Rudolph
29 Янв 2015 в 01:09
Я добавляю некоторые данные в вопрос.
 – 
academic.user
29 Янв 2015 в 01:10
,Спасибо . да без кодировки файла файл читается как вы упомянули
 – 
academic.user
29 Янв 2015 в 01:25

Должно работать следующее — заметьте, проверить не могу, так как у меня нет 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 предположительно не поддерживает кодовую страницу Unicode, которую понимает R. Фактически, при запуске кода с кодовой страницей, отличной от UTF-8, на Mac я получаю следующий вывод:

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])

plot output

2
Konrad Rudolph 29 Янв 2015 в 01:28
Спасибо за объяснение, но после некоторого анализа мне нужно записать данные обратно в csv, но теперь я просто записываю файл после x = read.csv('graph1.csv', encoding = 'UTF-8', stringsAsFactors = TRUE). Я получу вывод, как здесь, кодируя не настоящие данные.
 – 
academic.user
29 Янв 2015 в 01:47
@academic.user К сожалению, на данный момент отсутствие у меня доступа к Windows не позволяет мне попробовать то, что может сработать. Но вы пробовали просто записать файл? Данные вообще не изменились, так что это может сработать.
 – 
Konrad Rudolph
29 Янв 2015 в 02:30
.спасибо, да, я попробовал write.csv(network, file = "network.csv",row.names=FALSE) после network=read.csv("graph1.csv", encoding="UTF-8", header=TRUE), и результат: "X.U.FEFF.node1","node2","weight" "<U+0648><U+0631><U+0642>800*750*6","<U+0648><U+0631><U+0642> 1350*1230*6mm",0.600000024 "<U+0648><U+0631><U+0642>900*1200*6","<U+0648><U+0631><U+0642> 1350*1230*6mm",0.600000024
 – 
academic.user
29 Янв 2015 в 03:23