Excel в CSV с кодировкой UTF8

У меня есть файл Excel, в котором есть некоторые испанские символы (тильды и т. Д.), Которые мне нужно преобразовать в файл CSV для использования в качестве файла импорта. Однако, когда я делаю Save As CSV, он искажает "специальные" испанские символы, которые не являются символами ASCII. Похоже, что это также происходит с левыми и правыми кавычками и длинными черточками, которые, похоже, исходят от первоначального пользователя, создающего файл Excel в Mac.

Поскольку CSV - это просто текстовый файл, я уверен, что он может обрабатывать кодировку UTF8, поэтому я предполагаю, что это ограничение Excel, но я ищу способ перейти из Excel в CSV и сохранить символы, не входящие в ASCII. неповрежденными.

36 ответов

Решение

Простой обходной путь - использовать Google Spreadsheet. Вставьте (значения только при наличии сложных формул) или импортируйте лист, затем загрузите CSV. Я только что попробовал несколько символов, и это работает довольно хорошо.

ПРИМЕЧАНИЕ. Google Sheets имеет ограничения при импорте. Смотрите здесь.

ПРИМЕЧАНИЕ. Будьте осторожны с конфиденциальными данными в Google Sheets.

РЕДАКТИРОВАТЬ: Другая альтернатива - в основном они используют макрос VB или надстройки, чтобы принудительно сохранить как UTF8. Я не пробовал ни одно из этих решений, но они звучат разумно.

Я обнаружил, что приложение для работы с электронными таблицами OpenOffice, Calc, действительно хорошо обрабатывает данные CSV.

В диалоговом окне "Сохранить как..." нажмите "Параметры формата", чтобы получить различные кодировки для CSV. LibreOffice работает так же, как AFAIK.

диалог сохранения калькуляции

  1. Сохраните лист Excel как "Текст Unicode (.txt)". Хорошей новостью является то, что все международные символы находятся в UTF16 (обратите внимание, не в UTF8). Однако новый файл "*.txt" с разделителями TAB, без запятых и, следовательно, не является истинным CSV.

  2. (необязательно) Если вы не можете использовать файл TAB с разделителями для импорта, используйте ваш любимый текстовый редактор и заменяйте символы табуляции запятыми ",".

  3. Импортируйте ваш *.txt файл в целевое приложение. Убедитесь, что он может принять формат UTF16.

Если UTF-16 был правильно реализован с поддержкой кодовых точек, отличных от BMP, вы можете преобразовать файл UTF-16 в UTF-8 без потери информации. Я оставляю это вам, чтобы найти ваш любимый способ сделать это.

Я использую эту процедуру для импорта данных из Excel в Moodle.

Я знаю, что это старый вопрос, но я столкнулся с этим вопросом, когда боролся с теми же проблемами, что и ФП.

Не найдя ни одного из предложенных решений приемлемым вариантом, я решил выяснить, есть ли способ сделать это, просто используя Excel.

К счастью, я обнаружил, что проблема потерянных символов возникает (в моем случае) только при сохранении из формата xlsx в формат csv. Я попытался сохранить файл xlsx сначала в xls, затем в csv. Это действительно сработало.

Пожалуйста, попробуйте и посмотрите, работает ли он для вас. Удачи.

Вы можете использовать команду iconv под Unix (также доступна в Windows как libiconv).

После сохранения в формате CSV под Excel в командной строке введите:

iconv -f cp1250 -t utf-8 file-encoded-cp1250.csv > file-encoded-utf8.csv

(не забудьте заменить cp1250 вашей кодировкой).

Работает быстро и отлично подходит для больших файлов, таких как база данных почтовых индексов, которую нельзя импортировать в GoogleDocs (ограничение 400 000 ячеек).

Вы можете сделать это на современном компьютере с Windows без стороннего программного обеспечения. Этот метод является надежным, и он будет обрабатывать данные, которые содержат кавычки в кавычках, символы табуляции в кавычках, символы CJK и т. Д.

1. Сохранить из Excel

В Excel сохраните данные в file.txt используя тип Unicode Text (*.txt),

2. Запустите PowerShell

Бежать powershell из меню Пуск.

3. Загрузите файл в PowerShell

$data = Import-Csv C:\path\to\file.txt -Delimiter "`t" -Encoding BigEndianUnicode

4. Сохраните данные как CSV

$data | Export-Csv file.csv -Encoding UTF8 -NoTypeInformation

Единственный "легкий" способ сделать это заключается в следующем. Во-первых, поймите, что есть разница между тем, что отображается, и тем, что скрыто в файле.csv Excel.

(1) Откройте файл Excel, где у вас есть информация (.xls,.xlsx)

(2) В Excel выберите "CSV (запятая с разделителями") (*.csv) в качестве типа файла и сохраните в качестве этого типа.

(3) В NOTEPAD (находится в разделе "Программы", а затем "Стандартные" в меню "Пуск") откройте сохраненный файл.csv в блокноте.

(4) Затем выберите -> Сохранить как... и в нижней части окна "Сохранить как" есть поле выбора, помеченное как "Кодировка". Выберите UTF-8 (НЕ используйте ANSI, иначе вы потеряете все акценты и т. Д.). После выбора UTF-8, затем сохраните файл под немного другим именем файла, чем оригинал.

Этот файл находится в UTF-8 и сохраняет все символы и акценты и может быть импортирован, например, в MySQL и другие программы базы данных.

Этот ответ взят с этого форума.

Еще один, который я нашел полезным: "Числа" позволяют настройки кодирования при сохранении в формате CSV.

Использование Notepad++

Это исправит поврежденный файл CSV, сохраненный в Excel, и повторно сохранит его в правильной кодировке.

  • Экспорт CSV из Excel
  • Загрузить в Notepad++
  • Исправить кодировку
  • Сохранить

Excel сохраняет в CP-1252 / Windows-1252. Откройте файл CSV в Notepad++. Выбрать

Encoding > Character Sets > Western European > Windows-1252

затем

Encoding > Convert to UTF-8
File > Save

Сначала скажите Notepad++ кодировку, затем конвертируйте. Некоторые из этих других ответов конвертируются без предварительной установки правильной кодировки, еще больше искажая файл. Они повернут то, что должно быть в , Если ваш персонаж не вписывается в CP-1252, то он уже был потерян, когда был сохранен как CSV. Используйте другой ответ для этого.

"nevets1219" подходит для Google docs, однако, если вы просто "импортируете" файл, он часто не конвертирует его в UTF-8.

Но если вы импортируете CSV в существующую электронную таблицу Google, она конвертируется в UTF-8.

Вот рецепт:

  • На главном экране документов (или диска) нажмите кнопку "Создать" и выберите "Электронная таблица"
  • В меню "Файл" выберите "Импорт"
  • Нажмите "Выбрать файл"
  • Выберите "Заменить электронную таблицу"
  • Выберите любой символ, который вы используете в качестве разделителя
  • Нажмите "Импорт"
  • В меню "Файл" выберите "Загрузить как" -> CSV (текущий лист)

Полученный файл будет в UTF-8

В Excel 2016 у нас есть опция экспорта в CSV, предназначенная для формата UTF-8.

Как насчет использования Powershell.

Get-Content 'C:\my.csv' | Out-File 'C:\my_utf8.csv' -Encoding UTF8

Для тех, кто ищет полностью программное (или, по крайней мере, серверное) решение, я добился большого успеха, используя инструмент xls2csv от catdoc.

Установите catdoc:

apt-get install catdoc

Сделайте преобразование:

xls2csv -d utf-8 file.xls > file-utf-8.csv 

Это чертовски быстро.

Обратите внимание, что важно, чтобы вы включили -d utf-8 флаг, в противном случае он будет кодировать выходные данные по умолчанию cp1252 кодирование, и вы рискуете потерять информацию.

Обратите внимание, что xls2csv также работает только с .xls файлы, это не работает с .xlsx файлы.

Самый простой способ:нет необходимости Открыть офис и Google Docs

  1. Сохраните ваш файл как "текстовый файл Unicode";
  2. теперь у вас есть текстовый файл Unicode
  3. откройте его с помощью "блокнота" и "Сохранить как", выбрав "utf-8" или другую кодовую страницу, которую вы хотите
  4. переименовать расширение файла из "txt" в "csv"

все равно не открывайте его с помощью MS-офиса!!!Теперь у вас есть CSV-файл с разделителями табуляции.

Как ни странно, самый простой способ сохранить электронную таблицу размером 180 МБ в CSV-файле UTF8 - это выбрать ячейки в Excel, скопировать их и вставить содержимое буфера обмена в SublimeText.

Я тоже сталкивался с той же проблемой, но для этого есть простое решение.

  1. Откройте файл xlsx в Excel 2016 или более поздней версии.
  2. В "Сохранить как" выберите эту опцию: "(CSV UTF-8(запятая с разделителями)*. Csv)"

Он отлично работает и генерируется CSV-файл, который можно импортировать в любое программное обеспечение. Я импортировал этот CSV-файл в свою базу данных SQLITE, и он отлично работает со всеми символами Unicode.

Предполагая среду Windows, сохраните и поработайте с файлом как обычно в Excel, но затем откройте сохраненный файл Excel в Gnome Gnumeric (бесплатно). Сохраните электронную таблицу Gnome Gnumeric как CSV, которая, в любом случае, для меня, сохранит ее как UTF-8 CSV.

  1. Сохранить файл xls (файл Excel) как текст Unicode => файл будет сохранен в текстовом формате (.txt)

  2. Измените формат с.txt на.csv (переименуйте файл из XYX.txt в XYX.csv

Мне не удалось найти решение VBA для этой проблемы в Mac Excel. Казалось, просто нет способа вывести текст UTF-8.

Поэтому мне, наконец, пришлось отказаться от VBA, укусить пулю и выучить AppleScript. Это было не так плохо, как я думал.

Решение описано здесь: http://talesoftech.blogspot.com/2011/05/excel-on-mac-goodbye-vba-hello.html

Простой способ сделать это: скачать Open Office ( здесь), загрузить электронную таблицу и открыть файл Excel (.xls или же .xlsx). Затем просто сохраните его как текстовый CSV-файл, и откроется окно с просьбой сохранить текущий формат или сохранить в формате.ODF. выберите "сохранить текущий формат" и в новом окне выберите вариант, который лучше работает для вас, в зависимости от языка, на котором был написан ваш файл. Для испанского языка выберите Западную Европу (Windows-1252/ WinLatin 1) и файл работает просто отлично. Если вы выбираете Unicode (UTF-8), он не собирается работать с испанскими персонажами.

Второй вариант "nevets1219" - открыть файл CSV в Notepad++ и выполнить преобразование в ANSI.

Выберите в верхнем меню: Кодировка -> Конвертировать в Анси

Excel обычно сохраняет файл csv в кодировке ANSI вместо utf8.

Один из вариантов исправления файла - использовать Блокнот или Блокнот ++:

  1. Откройте.csv с помощью Блокнота или Блокнота ++.
  2. Скопируйте содержимое в буфер обмена вашего компьютера.
  3. Удалить содержимое из файла.
  4. Измените кодировку файла на utf8.
  5. Вставьте содержимое обратно из буфера обмена.
  6. Сохраните файл.

Наткнулся на ту же проблему и погуглил этот пост. Ничто из вышеперечисленного не помогло мне. Наконец я преобразовал свой Unicode .xls в.xml (выберите "Сохранить как... XML Spreadsheet 2003"), и он вывел правильный символ. Затем я написал код для разбора xml и извлек содержимое для моего использования.

Я написал небольшой скрипт на Python, который может экспортировать рабочие листы в UTF-8.

Вам просто нужно указать файл Excel в качестве первого параметра, а затем листы, которые вы хотите экспортировать. Если вы не предоставите листы, скрипт экспортирует все листы, которые присутствуют в файле Excel.

#!/usr/bin/env python

# export data sheets from xlsx to csv

from openpyxl import load_workbook
import csv
from os import sys

reload(sys)
sys.setdefaultencoding('utf-8')

def get_all_sheets(excel_file):
    sheets = []
    workbook = load_workbook(excel_file,use_iterators=True,data_only=True)
    all_worksheets = workbook.get_sheet_names()
    for worksheet_name in all_worksheets:
        sheets.append(worksheet_name)
    return sheets

def csv_from_excel(excel_file, sheets):
    workbook = load_workbook(excel_file,use_iterators=True,data_only=True)
    for worksheet_name in sheets:
        print("Export " + worksheet_name + " ...")

        try:
            worksheet = workbook.get_sheet_by_name(worksheet_name)
        except KeyError:
            print("Could not find " + worksheet_name)
            sys.exit(1)

        your_csv_file = open(''.join([worksheet_name,'.csv']), 'wb')
        wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
        for row in worksheet.iter_rows():
            lrow = []
            for cell in row:
                lrow.append(cell.value)
            wr.writerow(lrow)
        print(" ... done")
    your_csv_file.close()

if not 2 <= len(sys.argv) <= 3:
    print("Call with " + sys.argv[0] + " <xlxs file> [comma separated list of sheets to export]")
    sys.exit(1)
else:
    sheets = []
    if len(sys.argv) == 3:
        sheets = list(sys.argv[2].split(','))
    else:
        sheets = get_all_sheets(sys.argv[1])
    assert(sheets != None and len(sheets) > 0)
    csv_from_excel(sys.argv[1], sheets)

Другое решение состоит в том, чтобы открыть файл с помощью winword и сохранить его как TXT, а затем снова открыть его с помощью Excel, и он будет работать ISA

Диалог сохранения> Кнопка "Инструменты"> "Параметры сети"> вкладка "Кодировка"

Открыть.csv нормально с блокнотом ++. если вы видите, что ваша кодировка хороша (вы видите все символы такими, какими они должны быть), нажмите кодировку, затем конвертируйте в ANSI, иначе - узнайте, какая у вас текущая кодировка

Кодировка -> Преобразовать в Ansi закодирует его в ANSI/UNICODE. Utf8 является подмножеством Unicode. Возможно, в ANSI будут закодированы правильно, но здесь речь идет о UTF8, @SequenceDigitale.

Существуют более быстрые способы, такие как экспорт в формате csv (с разделителями-запятыми), а затем открытие этого csv с помощью Notepad++ (бесплатно), затем Encoding > Convert to UTF8. Но только если вы должны сделать это один раз для каждого файла. Если вам нужно часто менять и экспортировать, то лучшее решение - LibreOffice или GDocs.

Microsoft Excel имеет возможность экспортировать электронную таблицу с использованием кодировки Unicode. Смотрите следующий скриншот.

Мне нужно было автоматизировать этот процесс на моем Mac. Я изначально пытался использовать catdoc/xls2csv как предложено mpowered, но xls2csv возникли проблемы с обнаружением оригинальной кодировки документа, и не все документы были одинаковыми. В итоге я настроил выходную кодировку веб-страницы по умолчанию на UTF-8 а затем предоставить файлы в Apple Automator, применяя Convert Format of Excel Files действие для преобразования в Web Page (HTML), Затем с помощью PHP, DOMDocument а также XPathЯ запросил документы и отформатировал их CSV,

Это скрипт PHP (process.php):

<?php
$pi = pathinfo($argv[1]);
$file = $pi['dirname'] . '/' . $pi['filename'] . '.csv';
$fp = fopen($file,'w+');
$doc = new DOMDocument;
$doc->loadHTMLFile($argv[1]);
$xpath = new DOMXPath($doc);
$table = [];
foreach($xpath->query('//tr') as $row){
    $_r = [];
    foreach($xpath->query('td',$row) as $col){
        $_r[] = trim($col->textContent);
    }
    fputcsv($fp,$_r);
}
fclose($fp);
?>

И это команда оболочки, которую я использовал для преобразования документов HTML в CSV:

find . -name '*.htm' | xargs -I{} php ./process.php {}

Это действительно, очень обходной способ сделать это, но это был самый надежный метод, который я нашел.

Другие вопросы по тегам