4

Я получаю файл CSV от сервера. Данные внутри него разделены точкой с запятой и имеют формат UTF-8. Например, данные, которые мы получаем:

 "NL 我喜"" mutilple""我喜"

Когда мы впервые открываем его в Excel 2010 , он будет отображаться как

NL 我喜" mutilple"我喜

Но когда я изменяю (я просто удалил букву L из приведенного выше текста) этот файл и сохраняю его как CSV с помощью Excel и открываю его во второй раз, он будет выглядеть

N inbetween我喜 (без двойных кавычек)

Я хочу, чтобы данные после модификации сохранялись в двойных кавычках.

Спасибо

3 ответа3

2

Я попробовал это с помощью Excel 2016

Я открыл Excel - Выбрать файл, открыть, выбрать файл "CSV" и выбрать разделитель, точку с запятой в качестве разделителя и "в качестве разделителя текста.

Затем он был импортирован, как и ожидалось, и я мог отредактировать ячейку и удалить букву L в соответствии с исходным вопросом

Нажатие SAVE приводит к повреждению файла, как вы нашли и объяснили в других ответах.

Однако выберите SAVE AS и выберите UNICODE в соответствии с одним из комментариев - файл был сохранен в формате UTF-8 как TAB-файл с разделителем «» в качестве текстового разделителя. Вы пробовали это? Это не приемлемо?

Если я выбрал SAVEAS и выбрал UTF-8 с разделителями-запятыми, то он был сохранен с разделением запятыми UTF-8 - я не смог увидеть метод сохранения точки с запятой в качестве разделителя. Однако вы должны пройти через опции SAVE AS и посмотреть, приемлем ли один из форматов, доступных в вашей версии Excel.

Если необходимо сохранить точку с запятой, вы можете опубликовать в обработанном файле сценарий замены текста, который понимает кавычки (чтобы внутри кавычек не заменялись). Для этого можно написать сценарий VBScript или Powershell. Можно использовать макрос VBA для объединения всех ячеек в одну ячейку с разделением их запятыми.

Однострочная зависимая от Powershell команда для этого окончательного преобразования будет (Запуск из приглашения CMD)

powershell -command "& import-csv 'CSVUTF.CSV'| export-csv 'PSCSVUTF.CSV' -Encoding 'UTF8' -Delimiter ';' -notype"

Если в вашем файле нет строки заголовка с именами столбцов, необходимо указать параметр -header, а выходной файл будет содержать строку заголовка.

1

Похоже, на это ответили несколько лет назад в StackOverflow: https://stackoverflow.com/questions/4221176/excel-to-csv-with-utf8-encoding

По сути, Excel сохраняет CSV, используя только кодировку ASCII. Обходной путь - использовать OpenOffice, Google Docs или сохранить как текст в кодировке UTF8. Не уверен, как это повлияет на другие процессы, которые вы используете с этим файлом.

0

Я написал макрос VBA и логика:

  1. Если в ячейке данных есть double quote , продублируйте двойную кавычку.
  2. Если в ячейке данных есть comman или double quote , заключите все данные в двойные кавычки.

Пример:

  • Шаг 1: NL 我喜" mutilple"我喜 become 喜 станет NL 我喜"" mutilple""我喜
  • Шаг 2: После шага 2 данные станут "NL 我喜"" mutilple""我喜"

Этот код соответствует описанию выше

tempString = Sheets(1).Cells(lRow, lCol).Text                   ' Get the data from cell.
tempString = Replace(tempString, Chr(34), Chr(34) & Chr(34))    ' If there is double quote, then duplicate it.
CurrTextStr = tempString
pos1 = InStr(tempString, Chr(34))                               ' Get the position of double quote. If not present, it will be 0.
pos2 = InStr(tempString, ";")                                   ' Get the position of semicolon. If not present, it will be 0.
If (pos1 <> 0 Or pos2 <> 0) Then                                ' If there is any double quote or semicolon, then the whole data
    CurrTextStr = Chr(34) & tempString & Chr(34)                '       should be enclosed with double quotes.
End If
oAdoS.WriteText (";" & CurrTextStr)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .