Содержание
- Язвы и грабли CSV и Excel: проблемы и решения
- Экспортируйте из Excel в CSV с любым разделителем и кодировкой
- Перед началом работы добавьте «Экспорт в CSV» в Excel
- Как экспортировать выбранный диапазон из Excel в CSV
- Как экспортировать в CSV один или сразу несколько рабочих листов
- Как задать параметры обработки данных при экспорте из Excel в CSV
- Как экспортировать из Excel в CSV с разделителем точка с запятой, табуляция или вертикальная черта
Язвы и грабли CSV и Excel: проблемы и решения
CSV является стандартом де-факто для связи между собой разнородных систем, для передачи и обработки объемных данных с «жесткой», табличной структурой. Во многих скриптовых языках программирования есть встроенные средства разбора и генерации, он хорошо понятен как программистам, так и рядовым пользователям, а проблемы с самими данными в нем хорошо обнаруживаются, как говорится, на глаз.
История этого формата насчитывает не менее 30 лет. Но даже сейчас, в эпоху повального использования XML, для выгрузки и загрузки больших объемов данных по-прежнему используют CSV. И, несмотря на то, что сам формат довольно неплохо описан в RFC, каждый его понимает по-своему.
В этой статье я попробую обобщить существующие знания об этом формате, указать на типичные ошибки, а также проиллюстрировать описанные проблемы на примере кривой реализации импорта-экспорта в Microsoft Office 2007. Также покажу, как обходить эти проблемы (в т.ч. автоматическое преобразование типов Excel-ом в DATETIME и NUMBER) при открытии .csv.
Начнем с того, что форматом CSV на самом деле называют три разных текстовых формата, отличающихся символами-разделителями: собственно сам CSV (comma-separated values — значения, разделенные запятыми), TSV (tab-separated values — значения, разделенные табуляциями) и SCSV (semicolon separated values — значения, разделенные точкой с запятой). В жизни все три могут называться одним CSV, символ-разделитель в лучшем случае выбирается при экспорте или импорте, а чаще его просто «зашивают» внутрь кода. Это создает массу проблем в попытке разобраться.
Как иллюстрацию возьмем казалось бы тривиальную задачу: импортировать в Microsoft Outlook данные из таблицы в Microsoft Excel.
В Microsoft Excel есть средства экспорта в CSV, а в Microsoft Outlook — соответствующие средства импорта. Что могло быть проще — сделал файлик, «скормил» почтовой программе и — дело сделано? Как бы не так.
Создадим в Excel тестовую табличку:
… и попробуем экспортировать ее в три текстовых формата:
«Текст Unicode» | Кодировка — UTF-16, разделители — табуляция, переводы строк — 0×0D, 0×0A, объем файла — 222 байт |
«CSV (разделители — запятые)» | Кодировка — Windows-1251, разделители — точка с запятой (не запятая!), во второй строке значение телефонов не взято в кавычки, несмотря на запятую, зато взято в кавычки значение «01;02», что правильно. Переводы строк — 0×0D, 0×0A. Объем файла — 110 байт |
«Текстовые файлы (с разделителями табуляции)» | Кодировка — Windows-1251, разделители — табуляция, переводы строк — 0×0D, 0×0A. Значение «01;02» помещено в кавычки (без особой нужды). Объем файла — 110 байт |
Какой вывод мы делаем из этого. То, что здесь Microsoft называет «CSV (разделители — запятые)», на самом деле является форматом с разделителями «точка с запятой». Формат у Microsoft — строго Windows-1251. Поэтому, если у вас в Excel есть Unicode-символы, они на выходе в CSV отобразятся в вопросительные знаки. Также то, что переводами строк является всегда пара символов, то, что Microsoft тупо берет в кавычки все, где видит точку с запятой. Также то, что если у вас нет Unicode-символов вообще, то можно сэкономить на объеме файла. Также то, что Unicode поддерживается только UTF-16, а не UTF-8, что было бы сильно логичнее.
Теперь посмотрим, как на это смотрит Outlook. Попробуем импортировать эти файлы из него, указав такие же источники данных. Outlook 2007: Файл -> Импорт и экспорт… -> Импорт из другой программы или файла. Далее выбираем формат данных: «Значения, разделенные запятыми (Windows)» и «Значения, разделенные табуляцией (Windows)».
«Значения, разделенные табуляцией(Windows)» | Скармливаем аутлуку файл tsv, с разделенными табуляцией значениями и. — чтобы вы думали. Outlook склеивает поля и табуляцию не замечает. Заменяем в файле табуляцию на запятые и, как видим, поля уже разбирает, молодец. |
«Значения, разделенные запятыми (Windows)» | А вот аутлук как раз понимает все верно. Comma — это запятая. Поэтому ожидает в качестве разделителя запятую. А у нас после экселя — точка с запятой. В итоге аутлук распознает все неверно. |
Два майкрософтовских продукта не понимают друг друга, у них напрочь отсутствует возможность передать через текстовый файл структурированные данные. Для того, чтобы все заработало, требуются «пляски с бубном» программиста.
Мы помним, что Microsoft Excel умеет работать с текстовыми файлами, импортировать данные из CSV, но в версии 2007 он делает это очень странно. Например, если просто открыть файл через меню, то он откроется без какого-либо распознавания формата, просто как текстовый файл, целиком помещенный в первую колонку. В случае, если сделать дабл-клик на CSV, Excel получает другую команду и импортирует CSV как надо, не задавая лишних вопросов. Третий вариант — вставка файла на текущий лист. В этом интерфейсе можно настраивать разделители, сразу же смотреть, что получилось. Но одно но: работает это плохо. Например, Excel при этом не понимает закавыченных переводов строк внутри полей.
Более того, одна и та же функция сохранения в CSV, вызванная через интерфейс и через макрос, работает по-разному. Вариант с макросом не смотрит в региональные настройки вообще.
Стандарта CSV как такового, к сожалению, нет, но, между тем, существует т.н. memo. Это RFC 4180 года, в котором описано все довольно толково. За неимением ничего большего, правильно придерживаться хотя бы RFC. Но для совместимости с Excel следует учесть его собенности.
Вот краткая выжимка рекомендаций RFC 4180 и мои комментарии в квадратных скобках:
- между строками — перевод строки CRLF [на мой взгляд, им не стоило ограничивать двумя байтами, т.е. как CRLF (0×0D, 0×0A), так и CR 0×0D]
- разделители — запятые, в конце строки не должно быть запятой,
- в последней строке CRLF не обязателен,
- первая строка может быть строкой заголовка (никак не помечается при этом)
- пробелы, окружающие запятую-разделитель, игнорируются.
- если значение содержит в себе CRLF, CR, LF (символы-разделители строк), двойную кавычку или запятую (символ-разделитель полей), то заключение значения в кавычки обязательно. В противном случае — допустимо.
- т.е. допустимы переводы строк внутри поля. Но такие значения полей должны быть обязательно закавычены,
- если внутри закавыченной части встречаются двойные кавычки, то используется специфический квотинг кавычек в CSV — их дублирование.
Вот в нотации ABNF описание формата:
Также при реализации формата нужно помнить, что поскольку здесь нет указателей на число и тип колонок, поскольку нет требования обязательно размещать заголовок, здесь есть условности, о которых необходимо не забывать:
- строковое значение из цифр, не заключенное в кавычки может быть воспринято программой как числовое, из-за чего может быть потеряна информация, например, лидирующие нули,
- количество значений в каждой строке может отличаться и необходимо правильно обрабатывать эту ситуацию. В одних ситуациях нужно предупредить пользователя, в других — создавать дополнительные колонки и заполнять их пустыми значениями. Можно определиться, что количество колонок задается заголовком, а можно добавлять их динамически, по мере импорта CSV,
- Квотить кавычки через «слэш» не по стандарту, делать так не надо.
- Поскольку типизации полей нет, нет и требования к ним. Разделители целой и дробной частей в разных странах разные, и это приводит к тому, что один и тот же CSV, сгенрированный приложением, в одном экселе «понимается», в другом — нет. Потому что Microsoft Office ориентируется на региональные настройки Windows, а там может быть что угодно. В России там указано, что разделитель — запятая,
- Если CSV открывать не через меню «Данные», а напрямую, то Excel лишних вопросов не задает, и делает как ему кажется правильным. Например, поле со значением 1.24 он понимает по умолчанию как «24 января»
- Эксель убивает ведующие нули и приводит типы даже тогда, когда значение указано в кавычках. Делать так не надо, это ошибка. Но чтобы обойти эту проблему экселя, можно сделать небольшой «хак» — значение начать со знака «равно», после чего поставить в кавычках то, что необходимо передать без изменения формата.
- У экселя есть спецсимвол «равно», который в CSV рассматривается как идентификатор формулы. То есть, если в CSV встретится =2+3, он сложит два и три и результат впишет в ячейку. По стандарту он это делать не должен.
Пример валидного CSV, который можно использовать для тестов:
точно такой же SCSV:
Первый файлик, который реально COMMA-SEPARATED, будучи сохраненным в .csv, Excel-ом не воспринимается вообще.
Второй файлик, который по логике SCSV, экселом воспринимается и выходит вот что:
Ошибки Excel-я при импорте:
- Учлись пробелы, окружающие разделители
- Последний столбец вообще толком не распознался, несмотря на то, что данные в кавычках. Исключение составляет строка с «Петровым» — там корректно распозналось 1,24.
- В поле индекс Excel «опустил» ведущие нули.
- в самом правом поле последней строки пробелы перед кавычками перестали указывать на спецсимвол
Если же воспользоваться функционалом импорта (Данные -> Из файла) и обозвать при импорте все поля текстовыми, то будет следующая картина:
С приведением типов сработало, но зато теперь не обрабатываются нормально переводы строк и осталась проблема с ведущими нулями, кавычками и лишними пробелами. Да и пользователям так открывать CSV крайне неудобно.
Есть эффективный способ, как заставить Excel не приводить типы, когда это нам не нужно. Но это будет CSV «специально для Excel». Делается это помещением знака «=» перед кавычками везде, где потенциально может возникнуть проблема с типами. Заодно убираем лишние пробелы.
И вот что случаеся, если мы открываем этот файлик в экселе:
Чтобы сгенерировать такой CSV, которым можно было бы пользоваться, пользователю нужно дать возможность сделать следующие настройки перед экспортом:
- выбрать кодировку. Как правило, важно UTF-8, UTF-16, Windows-1251, KOI8-R. Чаще всего, других вариантов нет. Одна из них должна идти по умолчанию. В случае, если данные содержат символы, не имеющие аналогов в целевой кодировке, нужно предупреждать пользователя, что данные будут битые;
- выбрать разделитель между полями. Варианты — табуляция, запятая, точка с запятой. По умолчанию — точка с запятой. Не забыть, что если разделитель вводится в тексте, то будет очень непросто ввести туда табуляцию, это еще и непечатный символ;
- выбрать разделитель между строками (CRLF 0×0D 0×0A или CR 0×0D);
- выбрать разделитель целой и дробной части для числовых данных (точка или запятая).
- выбрать, выводить ли строку заголовка;
- выбрать, каким образом осуществлять квотинг спецсимволов (особенно переводов строк и кавычек). В принципе, можно отступиться от стандарта и квотировать их как n и », но нужно в этом случае не забыть квотировать сами n, если они встретятся и не забыть сделать это опцией при экспорте-импорте. Но совместимость пойдет лесом, потому что любой RFC-стандартный парсер конструкцию . «abc«»,… посчитает за ошибку;
- совсем в идеале — поставить галочку «для Excel» и учитывать там те нестандартности, которые внесла Майкрософт. К примеру, заменять значения числовых полей, «похожих на дату», на конструкцию =» «.
- определиться, нужно ли оставлять «хвост» из пустых разделителей, если он образуется. Например, из 20 полей только первое содержит данные, а остальные пустые. В итоге, в строке можно либо ставить после первого 19 разделителей, либо не ставить. Для больших объемов данных это может спасти миллисекунды обработки и уменьшить размер файла.
Чтобы построить хороший и удобный импортер CSV, необходимо помнить о следующем:
- разбор файла нужно делать по лексемам в соответствии с грамматикой выше или пользоваться хорошо зарекомендовавшими себя готовыми библиотеками (Excel работает иначе, потому с импортом проблема);
- предоставлять пользователю возможность выбрать кодировку (топ 4 достаточно);
- предоставлять пользователю возможность выбрать разделитель между полями (запятая, табуляция, точка с запятой достаточно);
- предоставлять пользователю возможность выбрать разделитель между строками, но кроме вариантов CR и CRLF нужно предусмотреть «CR или CRLF». Это связано с тем, что, например, Excel при экспорте таблицы с переводами строк внутри ячеек экспортирует эти переводы строк как CR, а остальные строки разделяет CRLF. При этом при импорте файла ему все равно, CR там или CRLF;
- предоставлять пользователю возможность выбрать разделитель между целой и дробной частей (запятая или точка);
- определиться с методом разбора — сначала читаем все в память, потом обрабатываем или обрабатываем строку за строкой. В первом случае может понадобиться больше памяти, во втором случае — ошибка в середине вызовет только частичный импорт, что может вызвать проблемы. Предпочительнее первый вариант.
Источник
Экспортируйте из Excel в CSV с любым разделителем и кодировкой
Популярность текстовых файлов CSV объясняется тем, что этот формат поддерживается большинством приложений. Поэтому конвертация файлов Excel в CSV файлы с запятыми в качестве разделителя вполне привычная операция. Но что если нужно экспортировать все листы в книге одновременно, или применить другой разделитель? Кроме того, операция «Сохранить как CSV» автоматически закрывает книгу Excel – и это осложняет работу, если нужно экспортировать данные многократно.
Инструмент «Экспорт в CSV» упрощает конвертацию XLSX (XLS) таблиц в формат CSV:
Перед началом работы добавьте «Экспорт в CSV» в Excel
«Экспорт в CSV» – это один из 20+ инструментов в составе надстройки XLTools для Excel. Работает в Excel 2019, 2016, 2013, 2010, десктоп Office 365.
Как экспортировать выбранный диапазон из Excel в CSV
На вкладке XLTools нажмите кнопку Экспорт В выпадающем списке выберите Экспорт в CSV
Откроется диалоговое окно.
Задайте Выбранный диапазон Укажите диапазон для экспорта.
Отметьте флажком Открыть файл после экспорта , если хотите сразу увидеть результат.
Нажмите ОК Сохраните CSV файл на свой компьютер
Готово.
Обратите внимание, что исходный файл Excel остается открытым и не изменился. Подробнее.
Как экспортировать в CSV один или сразу несколько рабочих листов
На вкладке XLTools нажмите кнопку Экспорт В выпадающем списке выберите Экспорт в CSV
Откроется диалоговое окно.
Задайте Этот рабочий лист или Все рабочие листы в этой книге .
Отметьте флажком Открыть файл (папку) после экспорта , если хотите сразу увидеть результат.
Нажмите ОК Сохраните CSV файл(ы) на свой компьютер
Готово.
Обратите внимание, что исходный файл Excel остается открытым и не изменился. CSV файлы будут названы по имени соответствующих исходных рабочих листов.
Другой способ сохранить несколько рабочих листов как CSV файлы – использовать XLTools «Органайзер книг».
На вкладке XLTools нажмите кнопку Органайзер книг Откроется диалоговое окно.
Из списка всех рабочих листов выберите один, все или всего несколько рабочих листов для экспорта.
Нажмите иконку Сохранить Из выпадающего списка выберите Сохранить лист(ы) как отдельные файлы .
Откроется окно Выберите сохранить как форматированный текст (разделитель – запятая) (*.csv)
Задайте параметры экспорта.
Нажмите ОК Сохраните CSV файл(ы) на свой компьютер
Готово.
Как задать параметры обработки данных при экспорте из Excel в CSV
Вы можете задать, как обрабатывать и экспортировать значения в CSV формат:
Выберите сохранить Как отформатированные значения
Выберите эту опцию, если нужно экспортировать значения в том же формате, который задан в Excel – как отображаются в ячейках. Например, 10%, 16 мар 2015, $40.
Выберите сохранить Как реальные значения
Выберите эту опцию, если нужно экспортировать значения в формате по умолчанию – как отображаются в строке формул Excel. Например, 0.1, 16.03.2015, 40.00.
Отметьте флажком С квалификатором
Отметьте эту опцию, если вам нужно добавить квалификаторы полей. Напечатайте » (двойная кавычка), или ‘ (одинарная кавычка), или любой другой знак. Надстройка добавит квалификаторы к каждому полю в файле результата CSV. Это полезная опция для тех, кто обрабатывает CSV файлы в системах предыдущих поколений.
Кроме того, вы можете отметить флажком удалить _ из данных . Это оставит знаки квалификатора только в начале и в конце поля и удалит из любых других позиций.
Например, если вы добавите ‘ (одинарную кавычку) в качестве квалификатора, при этом исходная таблица Excel уже содержит ‘ (одинарные кавычки или апострофы), это собьет границы полей в CSV файле. Поэтому вы можете задать удаление всех знаков одинарных кавычек, которые не являются квалификаторами, из файла результата CSV. Исходный Excel файл при том не изменится.
Отметьте флажком Разбить объединенные ячейки и дублировать значения
Отметьте эту опцию, если в исходной таблице есть объединенные ячейки. Надстройка продублирует содержимое объединённых ячеек в соответствующих местах текстовых строк в файле результата CSV.
Как экспортировать из Excel в CSV с разделителем точка с запятой, табуляция или вертикальная черта
Вы можете сохранить таблицу Excel как CSV файл как со стандартным разделителем запятой, так и задать другой подходящий разделитель между значениями в CSV файле:
Источник
Когда вы экспортируете или сохраняете диапазон данных из Excel в файл csv, обычно данные csv не заключены в двойные кавычки, но, если значения ваших ячеек разделены запятой или разрывом строки, экспортированные данные CSV будут с двойными кавычками. цитаты. В этой статье я расскажу о том, как сохранить данные рабочего листа в виде файла csv с двойными кавычками или без них, если вам нужно.
Сохраните данные рабочего листа как файл csv с двойными кавычками
Сохраняйте данные рабочего листа как файл csv без двойных кавычек
Сохраните данные рабочего листа как файл csv с двойными кавычками
Чтобы сохранить обычные данные в виде файла csv с двойными кавычками, вам может помочь следующий код VBA, пожалуйста, сделайте следующее:
1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.
2. Нажмите Вставить > Модулии вставьте следующий код в Модули Окно.
Код VBA: сохранить данные рабочего листа как файл csv с двойными кавычками:
Sub CSVFile()
'updateby Extendoffice
Dim xRg As Range
Dim xRow As Range
Dim xCell As Range
Dim xStr As String
Dim xSep As String
Dim xTxt As String
Dim xName As Variant
On Error Resume Next
If ActiveWindow.RangeSelection.Count > 1 Then
xTxt = ActiveWindow.RangeSelection.AddressLocal
Else
xTxt = ActiveSheet.UsedRange.AddressLocal
End If
Set xRg = Application.InputBox("Please select the data range:", "Kutools for Excel", xTxt, , , , , 8)
If xRg Is Nothing Then Exit Sub
xName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
xSep = Application.International(xlListSeparator)
Open xName For Output As #1
For Each xRow In xRg.Rows
xStr = ""
For Each xCell In xRow.Cells
xStr = xStr & """" & xCell.Value & """" & xSep
Next
While Right(xStr, 1) = xSep
xStr = Left(xStr, Len(xStr) - 1)
Wend
Print #1, xStr
Next
Close #1
If Err = 0 Then MsgBox "The file has saved to: " & xName, vbInformation, "Kutools for Excel"
End Sub
3, Затем нажмите F5 нажмите клавишу для запуска этого кода, и появится диалоговое окно, напоминающее вам о выборе диапазона данных, который вы хотите сохранить как файл csv с двойными кавычками, см. снимок экрана:
4. Затем нажмите OK и Сохранить как появится окно, укажите имя и расположение файла, а затем нажмите Сохраните кнопку, см. снимок экрана:
5, И Kutools for ExcelПоявится окно подсказки, чтобы напомнить вам, что новый файл CSV был сохранен в указанном месте, см. снимок экрана:
6. Нажмите OK чтобы закрыть диалоговое окно, и теперь, когда вы открываете новый файл csv, все данные заключаются в двойные кавычки, как показано на следующем снимке экрана:
Сохраняйте данные рабочего листа как файл csv без двойных кавычек
Если ваши данные разделены запятой, разрыв строки в ячейке, когда вы сохраняете данные как файл csv, данные будут заключены в двойные кавычки, как показано ниже:
Чтобы сохранить данные в виде CSV-файла без двойных кавычек, примените следующий код VBA.
1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.
2. Нажмите Вставить > Модулии вставьте следующий код в Модули Окно.
Код VBA: сохранить данные рабочего листа как файл csv без двойных кавычек:
Sub Export()
'updateby Extendoffice
Dim xRg As Range
Dim xRow As Range
Dim xCell As Range
Dim xStr As String
Dim xTxt As String
Dim xName As Variant
On Error Resume Next
If ActiveWindow.RangeSelection.Count > 1 Then
xTxt = ActiveWindow.RangeSelection.AddressLocal
Else
xTxt = ActiveSheet.UsedRange.AddressLocal
End If
Set xRg = Application.InputBox("Please select data range:", "Kutools for Excel", xTxt, , , , , 8)
If xRg Is Nothing Then Exit Sub
xName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
Open xName For Output As #1
For Each xRow In xRg.Rows
xStr = ""
For Each xCell In xRow.Cells
xStr = xStr & xCell.Value & Chr(9)
Next
While Right(xStr, 1) = Chr(9)
xStr = Left(xStr, Len(xStr) - 1)
Wend
Print #1, xStr
Next
Close #1
If Err = 0 Then MsgBox "The file has saved to: " & xName, vbInformation, "Kutools for Excel"
End Sub
3, Затем нажмите F5 нажмите клавишу для запуска этого кода, и появится диалоговое окно, напоминающее вам о выборе диапазона данных, который вы хотите сохранить как CSV без двойных кавычек, см. снимок экрана:
4. Нажмите OK и Сохранить как отображается окно, укажите имя файла и расположение для нового файла CSV, см. снимок экрана:
5, Затем нажмите Сохраните кнопка, а Kutools for ExcelПоявится окно подсказки, чтобы сообщить вам, что новый файл CSV был сохранен в указанном месте, см. снимок экрана:
6. Нажмите OK чтобы закрыть диалоговое окно, и, когда вы откроете новый файл csv, двойные кавычки, окруженные данными, будут удалены, как показано на следующем снимке экрана:
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Время на прочтение
11 мин
Количество просмотров 366K
CSV является стандартом де-факто для связи между собой разнородных систем, для передачи и обработки объемных данных с «жесткой», табличной структурой. Во многих скриптовых языках программирования есть встроенные средства разбора и генерации, он хорошо понятен как программистам, так и рядовым пользователям, а проблемы с самими данными в нем хорошо обнаруживаются, как говорится, на глаз.
История этого формата насчитывает не менее 30 лет. Но даже сейчас, в эпоху повального использования XML, для выгрузки и загрузки больших объемов данных по-прежнему используют CSV. И, несмотря на то, что сам формат довольно неплохо описан в RFC, каждый его понимает по-своему.
В этой статье я попробую обобщить существующие знания об этом формате, указать на типичные ошибки, а также проиллюстрировать описанные проблемы на примере кривой реализации импорта-экспорта в Microsoft Office 2007. Также покажу, как обходить эти проблемы (в т.ч. автоматическое преобразование типов Excel-ом в DATETIME и NUMBER) при открытии .csv.
Начнем с того, что форматом CSV на самом деле называют три разных текстовых формата, отличающихся символами-разделителями: собственно сам CSV (comma-separated values — значения, разделенные запятыми), TSV (tab-separated values — значения, разделенные табуляциями) и SCSV (semicolon separated values — значения, разделенные точкой с запятой). В жизни все три могут называться одним CSV, символ-разделитель в лучшем случае выбирается при экспорте или импорте, а чаще его просто «зашивают» внутрь кода. Это создает массу проблем в попытке разобраться.
Как иллюстрацию возьмем казалось бы тривиальную задачу: импортировать в Microsoft Outlook данные из таблицы в Microsoft Excel.
В Microsoft Excel есть средства экспорта в CSV, а в Microsoft Outlook — соответствующие средства импорта. Что могло быть проще — сделал файлик, «скормил» почтовой программе и — дело сделано? Как бы не так.
Создадим в Excel тестовую табличку:
… и попробуем экспортировать ее в три текстовых формата:
«Текст Unicode» | Кодировка — UTF-16, разделители — табуляция, переводы строк — 0×0D, 0×0A, объем файла — 222 байт |
«CSV (разделители — запятые)» | Кодировка — Windows-1251, разделители — точка с запятой (не запятая!), во второй строке значение телефонов не взято в кавычки, несмотря на запятую, зато взято в кавычки значение «01;02», что правильно. Переводы строк — 0×0D, 0×0A. Объем файла — 110 байт |
«Текстовые файлы (с разделителями табуляции)» | Кодировка — Windows-1251, разделители — табуляция, переводы строк — 0×0D, 0×0A. Значение «01;02» помещено в кавычки (без особой нужды). Объем файла — 110 байт |
Какой вывод мы делаем из этого?.. То, что здесь Microsoft называет «CSV (разделители — запятые)», на самом деле является форматом с разделителями «точка с запятой». Формат у Microsoft — строго Windows-1251. Поэтому, если у вас в Excel есть Unicode-символы, они на выходе в CSV отобразятся в вопросительные знаки. Также то, что переводами строк является всегда пара символов, то, что Microsoft тупо берет в кавычки все, где видит точку с запятой. Также то, что если у вас нет Unicode-символов вообще, то можно сэкономить на объеме файла. Также то, что Unicode поддерживается только UTF-16, а не UTF-8, что было бы сильно логичнее.
Теперь посмотрим, как на это смотрит Outlook. Попробуем импортировать эти файлы из него, указав такие же источники данных. Outlook 2007: Файл -> Импорт и экспорт… -> Импорт из другой программы или файла. Далее выбираем формат данных: «Значения, разделенные запятыми (Windows)» и «Значения, разделенные табуляцией (Windows)».
«Значения, разделенные табуляцией(Windows)» | Скармливаем аутлуку файл tsv, с разделенными табуляцией значениями и!.. — чтобы вы думали?.. Outlook склеивает поля и табуляцию не замечает. Заменяем в файле табуляцию на запятые и, как видим, поля уже разбирает, молодец. |
«Значения, разделенные запятыми (Windows)» | А вот аутлук как раз понимает все верно. Comma — это запятая. Поэтому ожидает в качестве разделителя запятую. А у нас после экселя — точка с запятой. В итоге аутлук распознает все неверно. |
Два майкрософтовских продукта не понимают друг друга, у них напрочь отсутствует возможность передать через текстовый файл структурированные данные. Для того, чтобы все заработало, требуются «пляски с бубном» программиста.
Мы помним, что Microsoft Excel умеет работать с текстовыми файлами, импортировать данные из CSV, но в версии 2007 он делает это очень странно. Например, если просто открыть файл через меню, то он откроется без какого-либо распознавания формата, просто как текстовый файл, целиком помещенный в первую колонку. В случае, если сделать дабл-клик на CSV, Excel получает другую команду и импортирует CSV как надо, не задавая лишних вопросов. Третий вариант — вставка файла на текущий лист. В этом интерфейсе можно настраивать разделители, сразу же смотреть, что получилось. Но одно но: работает это плохо. Например, Excel при этом не понимает закавыченных переводов строк внутри полей.
Более того, одна и та же функция сохранения в CSV, вызванная через интерфейс и через макрос, работает по-разному. Вариант с макросом не смотрит в региональные настройки вообще.
Стандарта CSV как такового, к сожалению, нет, но, между тем, существует т.н. memo. Это RFC 4180
2005-го
года, в котором описано все довольно толково. За неимением ничего большего, правильно придерживаться хотя бы RFC. Но для совместимости с Excel следует учесть его собенности.
Вот краткая выжимка рекомендаций RFC 4180 и мои комментарии в квадратных скобках:
- между строками — перевод строки CRLF [на мой взгляд, им не стоило ограничивать двумя байтами, т.е. как CRLF (0×0D, 0×0A), так и CR 0×0D]
- разделители — запятые, в конце строки не должно быть запятой,
- в последней строке CRLF не обязателен,
- первая строка может быть строкой заголовка (никак не помечается при этом)
- пробелы, окружающие запятую-разделитель, игнорируются.
- если значение содержит в себе CRLF, CR, LF (символы-разделители строк), двойную кавычку или запятую (символ-разделитель полей), то заключение значения в кавычки обязательно. В противном случае — допустимо.
- т.е. допустимы переводы строк внутри поля. Но такие значения полей должны быть обязательно закавычены,
- если внутри закавыченной части встречаются двойные кавычки, то используется специфический квотинг кавычек в CSV — их дублирование.
Вот в нотации ABNF описание формата:
file = [header CRLF] record *(CRLF record) [CRLF] header = name *(COMMA name) record = field *(COMMA field) name = field field = (escaped / non-escaped) escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE non-escaped = *TEXTDATA COMMA = %x2C DQUOTE = %x22 LF = %x0A CRLF = CR LF TEXTDATA = %x20-21 / %x23-2B / %x2D-7E
Также при реализации формата нужно помнить, что поскольку здесь нет указателей на число и тип колонок, поскольку нет требования обязательно размещать заголовок, здесь есть условности, о которых необходимо не забывать:
- строковое значение из цифр, не заключенное в кавычки может быть воспринято программой как числовое, из-за чего может быть потеряна информация, например, лидирующие нули,
- количество значений в каждой строке может отличаться и необходимо правильно обрабатывать эту ситуацию. В одних ситуациях нужно предупредить пользователя, в других — создавать дополнительные колонки и заполнять их пустыми значениями. Можно определиться, что количество колонок задается заголовком, а можно добавлять их динамически, по мере импорта CSV,
- Квотить кавычки через «слэш» не по стандарту, делать так не надо.
- Поскольку типизации полей нет, нет и требования к ним. Разделители целой и дробной частей в разных странах разные, и это приводит к тому, что один и тот же CSV, сгенрированный приложением, в одном экселе «понимается», в другом — нет. Потому что Microsoft Office ориентируется на региональные настройки Windows, а там может быть что угодно. В России там указано, что разделитель — запятая,
- Если CSV открывать не через меню «Данные», а напрямую, то Excel лишних вопросов не задает, и делает как ему кажется правильным. Например, поле со значением 1.24 он понимает по умолчанию как «24 января»
- Эксель убивает ведующие нули и приводит типы даже тогда, когда значение указано в кавычках. Делать так не надо, это ошибка. Но чтобы обойти эту проблему экселя, можно сделать небольшой «хак» — значение начать со знака «равно», после чего поставить в кавычках то, что необходимо передать без изменения формата.
- У экселя есть спецсимвол «равно», который в CSV рассматривается как идентификатор формулы. То есть, если в CSV встретится =2+3, он сложит два и три и результат впишет в ячейку. По стандарту он это делать не должен.
Пример валидного CSV, который можно использовать для тестов:
Фамилия, Имя, Адрес, Город/штат, индекс, просто строка Иванов,Иван, Ленина 20, Москва, 08075, "1/3" Tyler, John,110 terrace, PA,20121, "1.24" "Петров ""Кул""", Петя,120 Hambling St., NJ,08075, "1,24" Смирнов,Вася,"7452 Street ""Near the Square"" road", York, 91234, "3-01" ,Миша,,Ленинград, 00123, "03-01" "Джон ""Черная голова"", Клод",Рок,"", Маями бич,00111, "0000" Сергей,,
точно такой же SCSV:
Фамилия; Имя; Адрес; Город/штат; индекс; просто строка Иванов;Иван; Ленина 20; Москва; 08075;"1/3" Tyler; John;110 terrace; PA; 20121;"1.24" "Петров ""Кул"""; Петя;120 Hambling St.; NJ;08075;"1,24" Смирнов;Вася;"7452 Street ""Near the Square"" road"; York; 91234;"3-01" ;Миша;;Ленинград; 00123;"03-01" "Джон ""Черная голова""; Клод";Рок;""; Маями бич;00111; "0000" Сергей;;
Первый файлик, который реально COMMA-SEPARATED, будучи сохраненным в .csv, Excel-ом не воспринимается вообще.
Второй файлик, который по логике SCSV, экселом воспринимается и выходит вот что:
Ошибки Excel-я при импорте:
- Учлись пробелы, окружающие разделители
- Последний столбец вообще толком не распознался, несмотря на то, что данные в кавычках. Исключение составляет строка с «Петровым» — там корректно распозналось 1,24.
- В поле индекс Excel «опустил» ведущие нули.
- в самом правом поле последней строки пробелы перед кавычками перестали указывать на спецсимвол
Если же воспользоваться функционалом импорта (Данные -> Из файла) и обозвать при импорте все поля текстовыми, то будет следующая картина:
С приведением типов сработало, но зато теперь не обрабатываются нормально переводы строк и осталась проблема с ведущими нулями, кавычками и лишними пробелами. Да и пользователям так открывать CSV крайне неудобно.
Есть эффективный способ, как заставить Excel не приводить типы, когда это нам не нужно. Но это будет CSV «специально для Excel». Делается это помещением знака «=» перед кавычками везде, где потенциально может возникнуть проблема с типами. Заодно убираем лишние пробелы.
Фамилия;Имя;Адрес;Город/штат;индекс;просто строка Иванов;Иван;Ленина 20;Москва;="08075";="1/3" Tyler; John;110 terrace;PA;="20121";="1.24" "Петров ""Кул""";Петя;120 Hambling St.;NJ;="08075";="1,24" Смирнов;Вася;"7452 Street ""Near the Square"" road";York;="91234";="3-01" ;Миша;;Ленинград;="00123";="03-01" "Джон ""Черная голова"";Клод";Рок;"";Маями бич;="00111";="0000" Сергей;;
И вот что случаеся, если мы открываем этот файлик в экселе:
Резюмирую.
Чтобы сгенерировать такой CSV, которым можно было бы пользоваться, пользователю нужно дать возможность сделать следующие настройки перед экспортом:
- выбрать кодировку. Как правило, важно UTF-8, UTF-16, Windows-1251, KOI8-R. Чаще всего, других вариантов нет. Одна из них должна идти по умолчанию. В случае, если данные содержат символы, не имеющие аналогов в целевой кодировке, нужно предупреждать пользователя, что данные будут битые;
- выбрать разделитель между полями. Варианты — табуляция, запятая, точка с запятой. По умолчанию — точка с запятой. Не забыть, что если разделитель вводится в тексте, то будет очень непросто ввести туда табуляцию, это еще и непечатный символ;
- выбрать разделитель между строками (CRLF 0×0D 0×0A или CR 0×0D);
- выбрать разделитель целой и дробной части для числовых данных (точка или запятая).
- выбрать, выводить ли строку заголовка;
- выбрать, каким образом осуществлять квотинг спецсимволов (особенно переводов строк и кавычек). В принципе, можно отступиться от стандарта и квотировать их как n и «, но нужно в этом случае не забыть квотировать сами n, если они встретятся и не забыть сделать это опцией при экспорте-импорте. Но совместимость пойдет лесом, потому что любой RFC-стандартный парсер конструкцию …,»abc«»,… посчитает за ошибку;
- совсем в идеале — поставить галочку «для Excel» и учитывать там те нестандартности, которые внесла Майкрософт. К примеру, заменять значения числовых полей, «похожих на дату», на конструкцию =»<значение поля>«.
- определиться, нужно ли оставлять «хвост» из пустых разделителей, если он образуется. Например, из 20 полей только первое содержит данные, а остальные пустые. В итоге, в строке можно либо ставить после первого 19 разделителей, либо не ставить. Для больших объемов данных это может спасти миллисекунды обработки и уменьшить размер файла.
Чтобы построить хороший и удобный импортер CSV, необходимо помнить о следующем:
- разбор файла нужно делать по лексемам в соответствии с грамматикой выше или пользоваться хорошо зарекомендовавшими себя готовыми библиотеками (Excel работает иначе, потому с импортом проблема);
- предоставлять пользователю возможность выбрать кодировку (топ 4 достаточно);
- предоставлять пользователю возможность выбрать разделитель между полями (запятая, табуляция, точка с запятой достаточно);
- предоставлять пользователю возможность выбрать разделитель между строками, но кроме вариантов CR и CRLF нужно предусмотреть «CR или CRLF». Это связано с тем, что, например, Excel при экспорте таблицы с переводами строк внутри ячеек экспортирует эти переводы строк как CR, а остальные строки разделяет CRLF. При этом при импорте файла ему все равно, CR там или CRLF;
- предоставлять пользователю возможность выбрать разделитель между целой и дробной частей (запятая или точка);
- определиться с методом разбора — сначала читаем все в память, потом обрабатываем или обрабатываем строку за строкой. В первом случае может понадобиться больше памяти, во втором случае — ошибка в середине вызовет только частичный импорт, что может вызвать проблемы. Предпочительнее первый вариант.
Рауф Алиев,
заместитель технического директора Mail.Ru Group
MariaVS Пользователь Сообщений: 6 |
Добрый день! |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
<#0> |
MariaVS Пользователь Сообщений: 6 |
JayBhagavan
, спасибо за вариант! В нем добавляются кавычки. Если мне пойти от обратного и сохраненный файл перезаписать, заменив кавычки на что? на пустоту можно заменить? Потому что другой символ тоже не подойдет. |
Johny Пользователь Сообщений: 2737 |
Ну а просто конкатенацию использовать вручную? There is no knowledge that is not power |
MariaVS Пользователь Сообщений: 6 |
#5 01.12.2015 10:58:50 Johny
, да, таким образом строку и записываю в новый файл.
и в атрибуте «DS_Col_Saldo» в исходнике бывают значения типа школа, 25 — и тогда строчка — в двойные кавычки. Это, как я почитала, особенность сохранения в текстовые файлы, вот как ее обойти? Изменено: MariaVS — 01.12.2015 13:20:21 |
||
Johny Пользователь Сообщений: 2737 |
#6 01.12.2015 12:02:12 Вот пример:
Путь к файлу только поменяйте. В итоге получаем CSV файл, который нормально открывается экселем — с разбивкой. There is no knowledge that is not power |
||
MariaVS Пользователь Сообщений: 6 |
Johny
, вся беда в том, что конечные *.txt открываться будут не всеядным экселем, а 1С, заточенной под загрузку файла с определенной структурой.. ((( И если я уберу запятые в наименовании школа, 25 и получу на выходе школа 25, то конечный файл не загрузится. Надо на выходе получить текстовую строку (кодировка ms-dos) без пробелов с разделителем «;». Строку получаю, но в кавычках… Либо без кавычек, но с пробелами между «;» (пробовала не конкатенацией строку записывать, а столбцами, между столбцами с данными в пустой столбец сохраняла точку с запятой и потом сохраняла в текст. Тогда появлялись пробелы в строке между сохраненными столбцами, которые Trim_ом не убирались %-/) В общем, измудрялась как могла, и не могла, и вас всех зря мучаю… |
Johny Пользователь Сообщений: 2737 |
Тогда вам нужно приложение на C# написать — там можно кодировки какие угодно указывать. There is no knowledge that is not power |
MariaVS Пользователь Сообщений: 6 |
Johny
, а так хотелось обойтись всемогущим vba )))))) эх… «орешек знаний тверд…» (с) |
egonomist Пользователь Сообщений: 409 |
#10 01.12.2015 15:58:55 Добрый день. Наверное многое зависит от машины и ПО, у меня Ваш вариант и код Johny выдают результаты без кавычек.
|
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
MariaVS, кодировка — поиск по форуму. <#0> |
MariaVS Пользователь Сообщений: 6 |
#12 07.12.2015 18:02:06 JayBhagavan
, Johny , egonomist , спасибо вам, коллеги! Да, все получилось по коду Jonny (: Спасибо большое! Первое мое обращение, я верила, что мне помогут, ура!!!! Спасибо!!! |
Excel only places quotes around certain fields, how do I force excel to save a CSV file with quotes around every column?
asked Apr 13, 2010 at 19:17
Michael ShnitzerMichael Shnitzer
1,4773 gold badges14 silver badges14 bronze badges
If you open the XLS file in LibreOffice or OpenOffice, then Save As….and choose Text CSV, it alows generating a CSV file that also includes quotes as delimiters.
E.g.:
«Smith»,»Pete»,»Canada»
«Jones»,»Mary»,»England»
Just check the «Quote all text cells» box:
In order to also quote numeric fields, highlight your cell range and change the cell formatting to «text» prior to saving.
answered Sep 4, 2013 at 18:18
7
This page also has the solution which comes straight from the horse’s mouth:
http://support.microsoft.com/kb/291296/en-us
If the link degrades, the topic to search for is:
«Procedure to export a text file with both comma and quote delimiters in Excel» and/or «Q291296»
tl;dr: use their macro
answered Mar 7, 2012 at 10:09
sahmeepeesahmeepee
1,64711 silver badges13 bronze badges
4
Powershell appears to dump correctly. so something like
search for powershell.exe on windows machine if you dont know powershell.
import-csv C:TempMyfile.csv | export-csv C:TempMyfile_New.csv -NoTypeInformation -Encoding UTF8
Hope it helps someone.
answered Jan 24, 2018 at 23:10
ATekATek
5465 silver badges11 bronze badges
3
I found this easy solution:
- Highlight the cells you want to add the quotes.
- Right click and go to: Format Cells → Tab: Number → Category: Custom
- Paste the following into the Type field:
"''"@"''"
(see details below) - Click “okay”
The string you are pasting is "''"@"''"
which is double quote, single quote, single quote, double quote, @ symbol, double quote, single quote, single quote, double quote.
Edited for Excel 2010 from the information found here.
gronostaj
55.3k18 gold badges119 silver badges177 bronze badges
answered Aug 21, 2014 at 16:54
MichaelMichael
2312 silver badges2 bronze badges
5
This was the easiest for me: I imported the spreadsheet into Access 2010 and exported it from there as a delimited text file. Gave me the quote marks around my fields. Takes less than a minute for 42k rows now that I have the steps down.
answered May 23, 2014 at 13:56
1
I have found another work around which doesn’t involve the VBA Macro, but which does require Notepad++ or a similar macro-based text editor.
Export your file as Tab-seperated text, then open the exported file within Notepad++. Replace all instances of the ‘tab’ character with the text «,» (ie literally double-quote, comma, double-quote) and then use another macro to prefix and suffix each line of text with a double-quote.
A bit hacky but I found it quicker than getting a VBA macro working.
answered Jul 9, 2014 at 15:12
1
- Highlight the cells you want to add the quotes.
- Right click and go to: Format Cells → Tab: Number → Category: Custom
- Paste the following into the Type field:
"''"@"''"
(see details below) - Click “okay”
- Open the .csv file with Notepad (or equivalent)
- Replace all
' '
(repeated single quotes) with"
(double quote) - Replace all
;
- Save revised .csv file
phuclv
25.2k13 gold badges107 silver badges224 bronze badges
answered Oct 21, 2016 at 6:33
If you use Notepad++ to add quotes to the beginning of each line, just open the exported csv file, put your cursor at 1st line, 1st column, then click menu Edit/Column Editor…, in field ‘Text to insert‘, enter «, then the beginning of each line will have a quote, then you can use regular expression to search/replace all the tabs.
answered Jul 23, 2016 at 2:51
1
For Windows users
- «Save as» Excel file as CSV
- Open saved file with Mircrosoft Works Spreadsheet
- «Save as» the spreadsheet as CSV
- All non-numeric field now have » around them
Note this is not the same keyboard quote which has a forward & backward variety.
So if using CSV to LOAD into Mysql table, cut and paste into ENCLOSED parameter otherwise you will wonder why you get message #1083 - Field separator argument is not what is expected
nixda
26.5k17 gold badges107 silver badges155 bronze badges
answered Oct 8, 2013 at 17:34
1
I used the approach below to take three columns in Excel and build the string in the fourth column.
=CHAR(34)&A2&CHAR(34)&","&CHAR(34)&B2&CHAR(34)&","&CHAR(34)&C2&CHAR(34)&""
My issue with the "''"@"''"
approach is the second column of my data was a number the "''"@"''"
approach did nothing with the numbers. Sometimes the second column is blank but I needed to make sure it was represented in the final text file.
Excellll
12.5k11 gold badges50 silver badges78 bronze badges
answered Feb 3, 2015 at 15:47
Another way if you have MS access (I have ver 2007) import the file then
export it as a text file. Then change the .txt to .csv. Note all number fields
will not have double quotes around it so if you need double quotes around the numbers too then while in Access change the field from a number field to a text field.
answered Feb 24, 2016 at 18:11
I have run into this issue many times. Here is the simplest solution I have come up with.
- Save the file as Excel
- Import the Excel into an Access table
- Export the table from Access to a text file.
Access will allow you to specify exporting delimiter as a comma and qualifying text fields with quotes. In the export wizard, you can specify whatever delimiter or character around strings you want.
You may need to create an Access query to arrange the fields in a particular order or hide the auto-ID field added by Access.
Also… once exported to a CSV, do NOT open it in Excel again. If you want to look at the results, open it in notepad. Excel has a tendency to mess with the data of a csv…. I think it was fields padded with leading zeros if I remeber correctly.
answered Apr 6, 2016 at 18:58
1
Exporting comma separated and quoted strings can be done with only Excel 2016 and Notepad, using a copy of the data, a formula, an export, a file properties change, a replacement in Notepad, saving the exported file and cleanup. Each is a simple step. In detail:
-
Copy the columns to be exported into a new intermediate sheet to preserve the original and as backup, with the new sheet to be deleted later to leave the spreadsheet as it was.
-
Put otherwise not occurring character(s), say ‘#’ or ‘;-)’ at each end of a string in the column say A with the formula
=concat("#",trim(A1),"#")
, putting the formula on all the rows of another column.- Adjacent columns can be done at the same time but don’t quote numbers to avoid having them read in as strings.
- The trim avoids any trailing spaces which can trigger unskillful export behavior.
- Strings should not contain a ‘ » ‘ which might perturb import.
-
Copy the new column(s) back over A…, using the ‘123’ method so as to not carry the formula.
-
Export the sheet as a CSV file, to put in the commas between fields including numbers.
-
Change the file.csv properties so that it can be opened with Notepad.
-
Use Notepad to replace the arbitrary character(s) with ‘ » ‘.
-
While it would seem sensible to use » as the arbitrary character, it has to be put in a different cell, say ‘$A$50’, and then what appears on export is ‘ » » » ‘, apparently another inconvenient trigger.
-
In notepad the file should be saved, becoming a *.txt file to be imported and the intermediate *.csv deleted.
-
With cleanup of the extra spreadsheet sheet mission accomplished.
Perhaps the Access export tools can one day be embedded in Excel. A more generic approach among those programs that use cut and paste, would be to have the paste options include a choice of ways to interpret the output structure and provide delimiters.
answered May 30, 2016 at 12:31
Michael’s answer of Aug 21 2014 is really helpful. However, I had to perform an additional step or two:
- Open the .csv file with Notepad (or equivalent)
- Replace all » (repeated single quotes) with » (double quote)
- Replace all ; (used as delimiter in German version of Excel) with ,
- Save revised .csv file
user
29.2k11 gold badges99 silver badges144 bronze badges
answered Sep 10, 2014 at 12:34
0
Here’s how to use the OpenOffice app to take an Excel spreadsheet and create a text (csv) file with quotation marks around every text field.
Open the Excel file with OpenOffice, then follow these steps:
File > Save As
Provide a new name for the file you’re about to create
For Filetype, choose «Test CSV (.csv)»
turn on checkbox «Edit Filter Settings»
click «Save»
choose «Keep current format»
Field delimiter should be a comma: ,
Text delimiter should a quotation mark: «
check the box «Quote all text cells»
click «OK»
This worked for me!
answered Aug 19, 2019 at 22:22
I made my own VBA macro to create my CSV in no time.
It just put the result in a «output» sheet that you need to create.
The result double quote all column and add «;» as a delimiter.
If you guys ask, I can add some parameters to the code to add flexibility.
Hope you guys enjoy!
Public Sub CreateCSV()
Dim i, j, nc, nr As Integer
nr = Range("A65000").End(xlUp).Row
nc = Range("ZZ1").End(xlToLeft).Column
With Sheets("output")
.Cells.Clear
For i = 1 To nr
For j = 1 To nc
If j = 1 Then
.Cells(i, 1) = Chr(34) & Cells(i, j) & Chr(34) & ";"
ElseIf j = nc Then
.Cells(i, 1) = .Cells(i, 1) & Chr(34) & Cells(i, j) & Chr(34)
Else
.Cells(i, 1) = .Cells(i, 1) & Chr(34) & Cells(i, j) & Chr(34) & ";"
End If
Next j
Next i
End With
End Sub
squircle
6,7115 gold badges37 silver badges68 bronze badges
answered Oct 12, 2020 at 14:00
This can also be done by using Microsoft SQL Server management Studio. You basically just use the Import or Export feature to import or export your CSV file to a new CSV file with text qualifiers around each field.
- Create a database if one doesn’t exist
- Right-click the database (any database)
- Click Tasks
- Click Import Data (or Export data…either should work)
- For Data source, select Flat File Source
- Browse and select your existing CSV file
- Click Next and verify that everything looks right in the preview
- Click Next again
- For Destination, choose Flat File Destination
- Browse and specify the name and location of the new file that will
be created - For Text qualifier, enter » (one double quote)
- Click Next and then Finish
Your new file should now have double quotes around each field.
answered Apr 27, 2022 at 14:32
This is my recipe. I hate having to do this but I had no better way. In my case, I’m not getting quotes around any field. I also needed to use UTF-8 encoding and ; instead of tabs, so this is what I ended doing.
NOTE: due to the ilegibility of putting double quotes enclosed by single quotes and so on, I’ve used purposely «keyboard formatting» to indicate both keystrokes and literal characters and strings.
- Insert a new column before any other in your Excel spreadsheet (click on the title of the 1st column, the entire column gets selected, right click, select «insert»).
- Select the entire range of empty cells from the new column (they are selected by default). On the formula field, insert whatever you want: for instance, xxx. Press CTRL+enter to fill the entire column with the same value.
- Save the file as Unicode Text (*.txt).
- Open file in Notepad++.
- Press CTRL+f to open Search/Replace.
- Go to Replace tab.
- In «Search mode» select «Extended (n, r, t, , x…)».
- In the «Search» field, enter xxx plus a tab keystroke.
- In the «Replace» field, enter " (a double quote).
- Press Replace All.
- In the «Search» field, put a tab keystroke.
- In the «Replace» one, enter ";" (double quote, semicolon, double quote).
- Press Replace All.
- You are almost done. For the last double quote, enter r in the «Search» field and "r" (double quote, backslash, double quote) in the «Replace» one. Press Replace All.
- As long as you are not using chinese character, etc., you can change encoding to UTF-8 and save the file safely.
answered Sep 16, 2014 at 15:36
PerePere
1336 bronze badges
0