Странные символы добавлены к имени первого столбца после прочтения файла csv, экспортированного жабами

Всякий раз, когда я читаю файл 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"

Ответ 1

Попробуйте следующее:

d <- read.csv("test_file.csv", fileEncoding="UTF-8-BOM")

Это работает в R 3.0.0+ и удаляет спецификацию, если она присутствует в файле (общая для файлов, созданных из приложений Microsoft: Excel, SQL-сервер)

Ответ 2

Я знаю, что это очень старый вопрос, но самое простое решение, которое я нашел, это использовать NotePad++. Откройте файл CSV в NotePad++, нажмите "Кодирование", выберите "Кодировать в UTF-8" и сохраните файл. Это удаляет спецификацию, и оригинальный код должен работать.

Ответ 3

Я недавно столкнулся с этим с буфером обмена и Microsoft Excel

С постоянно растущим многоязычным контентом, используемым в науке о данных, просто не существует безопасного способа больше использовать 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, и, очевидно, автоматическое обнаружение кодирования не работает так...

Ответ 4

После изучения этого вопроса, это связано с добавлением символов BOM (Byte Order Mark). По-видимому, он не может использовать Quick Export, но мастер экспорта данных, поскольку он позволяет устанавливать кодировку файла. Он работал у меня, установив его в западноевропейскую (Windows) вместо unicode utf-8.

См. Как удалить ï" ¿из начала файла?