Ответ 1
Попробуйте следующее:
d <- read.csv("test_file.csv", fileEncoding="UTF-8-BOM")
Это работает в R 3.0.0+ и удаляет спецификацию, если она присутствует в файле (общая для файлов, созданных из приложений Microsoft: Excel, SQL-сервер)
Всякий раз, когда я читаю файл csv
в R (read.csv("file_name.csv")
), который был экспортирован с помощью toad, первому имени столбца предшествуют следующие символы " ï..". Кроме того, открытие файла csv в excel или notepad ++ отображается правильно (без предшествующих символов). Это хлопот, поскольку моим обходным путем было переименование столбца после каждого чтения.
Спасибо за любое исправление этой проблемы!
Edit:
Экспорт был создан в Toad, щелкнув правой кнопкой мыши на наборе результатов запроса и выбрав "Быстрый экспорт → Файл → Файл CSV"
Подробнее о комментариях:
head(readLines('test_file.csv'),n=3)
[1] "ID,LOCATION" "12021,1204" "12281,1204"
Попробуйте следующее:
d <- read.csv("test_file.csv", fileEncoding="UTF-8-BOM")
Это работает в R 3.0.0+ и удаляет спецификацию, если она присутствует в файле (общая для файлов, созданных из приложений Microsoft: Excel, SQL-сервер)
Я знаю, что это очень старый вопрос, но самое простое решение, которое я нашел, это использовать NotePad++. Откройте файл CSV в NotePad++, нажмите "Кодирование", выберите "Кодировать в UTF-8" и сохраните файл. Это удаляет спецификацию, и оригинальный код должен работать.
С постоянно растущим многоязычным контентом, используемым в науке о данных, просто не существует безопасного способа больше использовать utf-8 (в моем случае excel предполагал UTF-16, потому что большая часть моих данных включала традиционный китайский (мандарин)?).
Согласно Документам Microsoft в Windows используются следующие спецификации:
|----------------------|-------------|-----------------------|
| Encoding | Bom | Python encoding kwarg |
|----------------------|-------------|-----------------------|
| UTF-8 | EF BB BF | 'utf-8' |
| UTF-16 big-endian | FE FF | 'utf-16-be' |
| UTF-16 little-endian | FF FE | 'utf-16-le' |
| UTF-32 big-endian | 00 00 FE FF | 'utf-32-be' |
| UTF-32 little-endian | FF FE 00 00 | 'utf-32-le' |
|----------------------|-------------|-----------------------|
Я пришел к следующему подходу, который, кажется, хорошо работает для обнаружения кодирования с использованием метки порядка байтов в начале файла:
def guess_encoding_from_bom(filename, default='utf-8'):
msboms = dict((bom['sig'], bom) for bom in (
{'name': 'UTF-8', 'sig': b'\xEF\xBB\xBF', 'encoding': 'utf-8'},
{'name': 'UTF-16 big-endian', 'sig': b'\xFE\xFF', 'encoding':
'utf-16-be'},
{'name': 'UTF-16 little-endian', 'sig': b'\xFF\xFE', 'encoding':
'utf-16-le'},
{'name': 'UTF-32 big-endian', 'sig': b'\x00\x00\xFE\xFF', 'encoding':
'utf-32-be'},
{'name': 'UTF-32 little-endian', 'sig': b'\xFF\xFE\x00\x00',
'encoding': 'utf-32-le'}))
with open(filename, 'rb') as f:
sig = f.read(4)
for sl in range(3, 0, -1):
if sig[0:sl] in msboms:
return msboms[sig[0:sl]]['encoding']
return default
# Example using python csv module
def excelcsvreader(path, delimiter=',',
doublequote=False, quotechar='"', dialect='excel',
escapechar='\\', fileEncoding='UTF-8'):
filepath = os.path.expanduser(path)
fileEncoding = guess_encoding_from_bom(filepath, default=fileEncoding)
if os.path.exists(filepath):
# ok let open it and parse the data
with open(filepath, 'r', encoding=fileEncoding) as csvfile:
csvreader = csv.DictReader(csvfile, delimiter=delimiter,
doublequote=doublequote, quotechar=quotechar, dialect=dialect,
escapechar='\\')
for (rnum, row) in enumerate(csvreader):
yield (rnum, row)
Я понимаю, что для этого необходимо открыть файл для чтения дважды (один раз в двоичном формате и один раз в виде закодированного текста), но API в действительности не позволяет легко сделать иначе в этом конкретном случае.
Во всяком случае, я думаю, что это немного надежнее, чем просто предположить, что utf-8, и, очевидно, автоматическое обнаружение кодирования не работает так...
После изучения этого вопроса, это связано с добавлением символов BOM (Byte Order Mark). По-видимому, он не может использовать Quick Export, но мастер экспорта данных, поскольку он позволяет устанавливать кодировку файла. Он работал у меня, установив его в западноевропейскую (Windows) вместо unicode utf-8.