Csv файл что это
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, экселом воспринимается и выходит вот что:
- Учлись пробелы, окружающие разделители
- Последний столбец вообще толком не распознался, несмотря на то, что данные в кавычках. Исключение составляет строка с «Петровым» — там корректно распозналось 1,24.
- В поле индекс Excel «опустил» ведущие нули.
- в самом правом поле последней строки пробелы перед кавычками перестали указывать на спецсимвол
Если же воспользоваться функционалом импорта (Данные -> Из файла) и обозвать при импорте все поля текстовыми, то будет следующая картина:
С приведением типов сработало, но зато теперь не обрабатываются нормально переводы строк и осталась проблема с ведущими нулями, кавычками и лишними пробелами. Да и пользователям так открывать CSV крайне неудобно.
Есть эффективный способ, как заставить Excel не приводить типы, когда это нам не нужно. Но это будет CSV «специально для Excel». Делается это помещением знака «=» перед кавычками везде, где потенциально может возникнуть проблема с типами. Заодно убираем лишние пробелы.
И вот что случаеся, если мы открываем этот файлик в экселе:
Уже не первый год пользуюсь своим универсальным конвертером CSV файлов в БД SQL Server - ImportExportDataSql, который имеет ряд полезных функций, необходимых любому разработчику БД MSSQL, например: перенос данных с одной БД в другую через SQL скрипт, выгрузка структуры БД, загрузка файлов в БД, выгрузка файлов из БД на диск (кроме этого, обработка типа varbinary работает в CSV), объединение SQL выборок в один файл и др.
ImportExportDataSql бесплатный, портативный, без рекламы и оповещает об обновлениях.
Поставил себе цель, ускорить загрузку CSV в БД MSSQL быстрее, чем это делает стандартная утилита "bcp". В моем приложении используется стандартный способ чтения CSV файлов, через System.IO.StreamReader методом ReadLine, но я уверен, что стандартные способы не самые производительные.
максимальное потребление оперативной памяти
средняя нагрузка CPU (%)
Подробные результаты тестов, а также исходники для тестирования описанных способов, приведены в конце статьи.
Способ 7. CsvHelper
Проект выложен на github. С помощью этой библиотеки необходимо обязательно создавать класс для маппинга, при чем названия полей свойств должны быть такие же как заголовок в CSV файле. Соответственно, файл без заголовка CsvHelper не может прочитать.
По всем параметрам данный способ занимает 6-е место из 7.
Метод построчного (one row) чтения файла с помощью CSVHelper
Способ 1: Обычное открытие файла
Но вначале мы остановимся на варианте, когда документ CSV создан в русскоязычной программе и уже готов для открытия в Эксель без дополнительных манипуляций над содержимым.
Если программа Excel уже является установленной для открытия документов CSV на вашем компьютере по умолчанию, то в этом случае достаточно кликнуть по файлу двойным щелчком левой кнопки мыши, и он откроется в Экселе. Если же связь ещё не установлена, то в этом случае нужно выполнить ряд дополнительных манипуляций.
-
Находясь в Проводнике Windows в той директории, где расположен файл, кликаем правой кнопкой мыши по нему. Запускается контекстное меню. Выбираем в нем пункт «Открыть с помощью». Если в дополнительном открывшемся списке имеется наименование «Microsoft Office», то кликаем по нему. После этого документ просто запустится в вашем экземпляре Экселя. Но, если данного пункта вы не обнаружите, то щелкайте по позиции «Выбрать программу».
C:\Program Files\Microsoft Office\Office№
После этого содержимое документа CSV будет открыто в Экселе. Но данный способ подойдет исключительно в том случае, если не будет проблем с локализацией или с отображением кириллицы. К тому же, как мы видим, придется выполнить некоторое редактирование документа: так как информация не во всех случаях вмещается в текущий размер ячеек, их нужно расширять.
Способ 1: Microsoft Excel
Рассмотрим, как запустить CSV в популярном текстовом процессоре Эксель, который входит в пакет Microsoft Office.
-
Запустите Excel. Перейдите во вкладку «Файл».
Существует ещё один метод перехода в «Мастер текстов».
- Переместитесь в раздел «Данные». Нажимайте на объект «Из текста», размещенный в блоке «Получение внешних данных».
Поэтому пользователь сам должен установить, служит ли в данном случае конкретный символ разделителем или является обычным знаком пунктуации. Это он может сделать, взглянув на текст, который отображается в области «Образец разбора данных» и основываясь на логике.
- пропустить столбец;
- текстовый;
- дата;
- общий.
Способ 2. System.IO.StreamReader (метод Split)
Это стандартный и самый простой способ чтения файлов, который имеет один недостаток при вызове метода ReadLine(): возникает ошибка OutOfMemoryException, если имеется очень длинная строка в файле.
Данный способ используется чаще всего при разработке приложений. В этом тесте мы будем использовать метод Split, который разбивает строку на поля по указанному символу разделителю. По результатам, данный способ показал 4 место по времени выполнения и 3 место по использованию памяти. Я был немного удивлен, что данный способ далеко не самый быстрый.
Что такое CSV-файлы
Формат CSV используют, чтобы хранить таблицы в текстовых файлах. Данные очень часто упаковывают именно в таблицы, поэтому CSV-файлы очень популярны.
CSV-файл состоит из строк с данными и разделителей, которые обозначают границы столбцов
CSV расшифровывается как comma-separated values — «значения, разделенные запятыми». Но пусть название вас не обманет: разделителями столбцов в CSV-файле могут служить и точки с запятой, и знаки табуляции. Это все равно будет CSV-файл.
У CSV куча плюсов перед тем же форматом Excel: текстовые файлы просты как пуговица, открываются быстро, читаются на любом устройстве и в любой среде без дополнительных инструментов.
Из-за своих преимуществ CSV — сверхпопулярный формат обмена данными, хотя ему уже лет 40. CSV используют прикладные промышленные программы, в него выгружают данные из баз.
Одна беда — текстового редактора для работы с CSV мало. Еще ничего, если таблица простая: в первом поле ID одной длины, во втором дата одного формата, а в третьем какой-нибудь адрес. Но когда поля разной длины и их больше трех, начинаются мучения.
Следить за разделителями и столбцами — глаза сломаешь
Еще хуже с анализом данных — попробуй «Блокнотом» хотя бы сложить все числа в столбце. Я уж не говорю о красивых графиках.
Поэтому CSV-файлы анализируют и редактируют в Excel и аналогах: Open Office, LibreOffice и прочих.
Ветеранам, которые все же дочитали: ребята, мы знаем об анализе непосредственно в БД c помощью SQL, знаем о Tableau и Talend Open Studio. Это статья для начинающих, а на базовом уровне и небольшом объеме данных Excel с аналогами хватает.
Способ 3. LumenWorks.Framework.IO.Csv.CsvReader
Подробности описания данного метода см. здесь. По итогам теста, данный способ немного быстрее стандартного метода, но это происходит только с файлом, который участвует в тесте (размером 557Мб, 44 столбца).
Я протестировал обработку другого файла, размером 795 Мб и этот метод оказался самым быстрым. Файл размером 795 Мб (32 столбца) обрабатывался в среднем за 2233 мс.
Возможно, увеличение количества столбцов в CSV так сильно повлияло на работу этой библиотеки и производительность упала в 2 раза.
Данная библиотека не умеет обрабатывать CSV отдельно по строкам, вместо этого она пытается загрузить весь файл в объект, который должен быть заранее описан в виде отдельного класса или структуры. В связи с этими недостатками, библиотека показала самые худшие результаты обработки больших CSV файлов. FileHelpers не только самая медленная, но еще и очень сильно потребляет память, а диагностика нам показывает, что сборщик мусора вызывается постоянно.
На картинке ниже сравниваем способы 2 (слева) и 4 (справа):
Обратите внимание на график Process Memory, на желтые флажки, которые означают запуск сборки мусора. Слева всего 6 раз вызывается GC, а справа бесчисленное количество раз, что сказывается на производительности.
При обработке файла размером 795Мб сначала тест провалился. Во первых, нехватает памяти, во-вторых начинает работать процесс "Отчет об ошибках Windows"
Чтобы избежать нехватки памяти добавил принудительный вызов сбора мусора:
После этого тест прошел и я увидел, что данный способ для обработки файла 795 Мб требуется в 10 раз больше памяти.
Для моего приложения этот способ совсем не подходит, так как я заранее не знаю сколько полей будет в CSV и определять заранее класс или структуру неудобно. Возможно, популярность библиотеки (судя по количеству звезд на github), объясняется не производительностью, а другими возможностями. Если найдутся разработчики, которые читают эту статью и используют FileHelpers, напишут нам в комментариях, за что им нравится эта библиотека.
Способ 7: Microsoft Outlook
Некоторые объекты CSV представляют собой экспортированные из почтового клиента электронные письма. Их можно просматривать с помощью программы Microsoft Outlook, произведя процедуру импортирования.
-
Запустите Аутлук. После открытия программы перейдите во вкладку «Файл». Затем щелкните «Открыть» в боковом меню. Далее жмите «Импорт».
Стоит, правда, заметить, что данным способом можно запустить далеко не все объекты формата CSV, а только письма, структура которых отвечает определенному стандарту, а именно содержащие поля: тема, текст, адрес отправителя, адрес получателя и др.
Как видим, существует довольно много программ для открытия объектов формата CSV. Как правило, лучше всего просматривать содержимое таких файлов в табличных процессорах. Редактирование можно выполнять в виде текста в текстовых редакторах. Кроме того, существуют отдельные CSV с определенной структурой, с которыми работают специализированные программы, например почтовые клиенты.
Мы рады, что смогли помочь Вам в решении проблемы.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
Как Excel портит данные: из классики
Все бы ничего, но Excel, едва открыв CSV-файл, начинает свои лукавые выкрутасы. Он без спроса меняет данные так, что те приходят в негодность. Причем делает это совершенно незаметно. Из-за этого в свое время мы схватили ворох проблем.
Большинство казусов связано с тем, что программа без спроса преобразует строки с набором цифр в числа.
Округляет. Например, в исходной ячейке два телефона хранятся через запятую без пробелов: «5235834,5235835». Что сделает Excel? Лихо превратит номера́ в одно число и округлит до двух цифр после запятой: «5235834,52». Так мы потеряем второй телефон.
Приводит к экспоненциальной форме. Excel заботливо преобразует «123456789012345» в число «1,2E+15». Исходное значение потеряем напрочь.
Проблема актуальна для длинных, символов по пятнадцать, цифровых строк. Например, КЛАДР-кодов (это такой государственный идентификатор адресного объекта: го́рода, у́лицы, до́ма).
Потеря плюса критична, например, если данные пойдут в стороннюю систему, а та при импорте жестко проверяет формат.
Разбивает по три цифры. Цифровую строку длиннее трех символов Excel, добрая душа, аккуратно разберет. Например, «8 495 5235834» превратит в «84 955 235 834».
Форматирование важно как минимум для телефонных номеров: пробелы отделяют коды страны и города от остального номера и друг от друга. Excel запросто нарушает правильное членение телефона.
Удаляет лидирующие нули. Строку «00523446» Excel превратит в «523446».
А в ИНН, например, первые две цифры — это код региона. Для Республики Алтай он начинается с нуля — «04». Без нуля смысл номера исказится, а проверку формата ИНН вообще не пройдет.
Меняет даты под локальные настройки. Excel с удовольствием исправит номер дома «1/2» на «01.фев». Потому что Windows подсказал, что в таком виде вам удобнее считывать даты.
Таблица сравнения результатов
Тесты проводились на двух файлах. Первый файл слева (до знака /), второй файл справа (после знака /):
размер файла - 557 Мб / 795 Мб
количество строк - 4 496 263 / 3 697 693
количество полей 44 / 32
Способ Multiline Csv Reader реализован в моем приложении ImportExportDataSql, который использует класс System.IO.StreamReader метод ReadLine (в таблице мой метод до оптимизации кода) и он немного быстрее метода Split().
Продукты HFLabs в промышленных объемах обрабатывают данные: адреса, ФИО, реквизиты компаний и еще вагон всего. Естественно, тестировщики ежедневно с этими данными имеют дело: обновляют тест-кейсы, изучают результаты очистки. Часто заказчики дают «живую» базу, чтобы тестировщик настроил сервис под нее.
Первое, чему мы учим новых QA — сохранять данные в первозданном виде. Все по заветам: «Не навреди». В статье я расскажу, как аккуратно работать с CSV-файлами в Excel и Open Office. Советы помогут ничего не испортить, сохранить информацию после редактирования и в целом чувствовать себя увереннее.
Материал базовый, профессионалы совершенно точно заскучают.
Загрузка CSV файла с помощью ImportExportDataSql
С помощью ImportExportDataSql можно избавиться от ошибок, описанных выше, не изменяя CSV файл.
Пример загрузки CSV файла, с помощью ImportExportDataSql Результат загрузки CSV с несколькими строками, с помощью ImportExportDataSql
Способ 6: Safari
Просмотреть содержимое в текстовом варианте без возможности его редактирования можно в браузере Safari. Большинство других популярных браузеров такую возможность не предоставляют.
-
Запустите Сафари. Щелкайте «Файл». Далее жмите на «Открыть файл…».
Как проводилось тестирование?
Один и тот же CSV файл обрабатывался в цикле 10 раз подряд одним и тем же способом. Пока работает цикл, в отдельном потоке таймер раз в 300 милисекунд собирает статистику потребления памяти и нагрузку процессора, чтобы в конце посчитать средние показатели (в таблице результатов они обозначены AVG).
Все тесты проводились в сборке "Release".
Тесты проводились на прогретом железе, т.е. приложение запускалось несколько раз, пока время обработки файла в цикле будет примерно одинаково.
Для каждого теста оставлял в коде только один способ тестирования и прогонял их по очереди отдельными exe файлами. Итоги записывал в таблицу сравнения результатов.
Открытие документов CSV
Название формата CSV является аббревиатурой наименования «Comma-Separated Values», что переводится на русский язык, как «значения, разделенные запятыми». Действительно, в этих файлах в качестве разделителей выступают запятые, хотя в русскоязычных версиях, в отличие от англоязычных, все-таки принято применять точку с запятой.
При импорте файлов CSV в Эксель актуальной является проблема воспроизведения кодировки. Зачастую документы, в которых присутствует кириллица, запускаются с текстом изобилующим «кракозябрами», то есть, нечитаемыми символами. Кроме того, довольно частой проблемой является вопрос несоответствия разделителей. В первую очередь, это касается тех ситуаций, когда мы пытаемся открыть документ, сделанный в какой-то англоязычной программе, Экселем, локализованном под русскоязычного пользователя. Ведь в исходнике разделителем является запятая, а русскоязычный Excel воспринимает в этом качестве точку с запятой. Поэтому опять получается некорректный результат. Мы расскажем, как решить и эти проблемы при открытии файлов.
Альтернатива: Open Office Calc
Для работы с CSV-файлами я использую именно Calc. Он не то чтобы совсем не считает цифровые данные строками, но хотя бы не применяет к ним переформатирование в соответствии с региональными настройками Windows. Да и импорт попроще.
Конечно, понадобится пакет Open Office (OO). При установке он предложит переназначить на себя файлы MS Office. Не рекомендую: хоть OO достаточно функционален, он не до конца понимает хитрое микрософтовское форматирование документов.
А вот назначить OO программой по умолчанию для CSV-файлов — вполне разумно. Сделать это можно после установки пакета.
Итак, запускаем импорт данных из CSV. После двойного клика на файле Open Office показывает диалог.
Заметьте, в OO не нужно создавать новый воркбук и принудительно запускать импорт, все само
- Кодировка — как в файле.
- «Разделитель» — точка с запятой. Естественно, если в файле разделителем выступает именно она.
- «Разделитель текста» — пустой (все то же, что в Excel).
- В разделе «Поля» кликаю в левый-верхний квадрат таблицы, подсвечиваются все колонки. Указываю тип «Текст».
Помимо Calc у нас в HFLabs популярен libreOffice, особенно под «Линуксом». И то, и другое для CSV применяют активнее, чем Excel.
Способ 5: Notepad++
Открывать можно и с помощью более продвинутого текстового редактора — Notepad++.
-
Включите Notepad++. Щелкните в меню «Файл». Далее выбирайте «Открыть…». Также можете применить Ctrl+O.
Способ 3: открытие через вкладку «Файл»
Существует также способ открыть документ CSV через вкладку «Файл» программы Excel.
-
Запускаем Excel и перемещаемся во вкладку «Файл». Щелкаем по пункту «Открыть», расположенному в левой части окна.
Как видим, несмотря на некоторые проблемы с открытием документов формата CSV в Экселе, решить их все-таки можно. Для этого нужно воспользоваться встроенным инструментом Excel, который называется Мастер текстов. Хотя, для многих случаев вполне достаточно и применения стандартного метода открытия файла двойным щелчком левой кнопки мыши по его наименованию.
Мы рады, что смогли помочь Вам в решении проблемы.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
CSV (Comma-Separated Values) представляет собой файл текстового формата, который предназначен для отображения табличных данных. При этом колонки разделяются запятой и точкой с запятой. Узнаем, с помощью каких приложений можно открыть данный формат.
Программы для работы с CSV
Как правило, для корректного просмотра содержимого CSV используются табличные процессоры, а для их редактирования можно применять и текстовые редакторы. Давайте подробнее рассмотрим алгоритм действий при открытии различными программами данного типа файлов.
Способ 1. Загрузка CSV с многострочными полями
Для начала хотелось бы рассказать о том, в чем преимущество ImportExportDataSql перед стандартными способами загрузки CSV в SQL Server (утилита bcp или операция BULK INSERT).
загрузка больших CSV файлов блоками (1 блок = 1 транзакция = N строк, где N указывает сам пользователь)
загружать CSV/Excel файлы с возможностью настройки полей, а также с ограничением количества обрабатываемых строк (удобно при отладке)
поля в заголовке не привязаны к порядковому номеру, например: файлы с заголовками "Фамилия;Имя;Отчество" и "Имя;Отчество;Фамилия" будут обработаны одинаково, независимо от порядка полей. В "bcp" это можно реализовать только с использованием файлов форматирования, а в BULK INSERT нельзя менять последовательность полей
загружать несколько CSV файлов в БД из одной папки, используя маску файлов
автоматическое создание таблицы, если её не существует, в том числе во временные глобальные таблицы (рассмотрим в примере ниже). Таблица создается в режиме "Простой импорт", в остальных режимах таблица не создается.
поддерживается обработка varbinary полей
возможность добавлять свои поля, которых нет в CSV файле с помощью встроенных функций
фильтр полей в режиме "Поиск по заголовку"
Список встроенных функций обработки CSV в ImportExportDataSql
NEWID - генерация GUID значения
ROWNUM - порядковый номер записи
EXCELROWNUM - номер строки в CSV/Excel файле
FILENAME - имя обрабатываемого файла
В качестве примера, будем использовать текстовый файл с именем multiline.csv, со следующим содержимым:
Способ 3: OpenOffice Calc
Просмотреть CSV можете с помощью ещё одного табличного процессора — OpenOffice Calc.
-
Запустите ОупенОфис. В главном окне нажимайте «Открыть…» или используйте Ctrl+O.
Также можете использовать меню. Для этого перейдите по пунктам «Файл» и «Открыть…».
Как и при использовании метода с предыдущей программой, добраться до окна открытия объекта можно прямо через интерфейс Кальк. В этом случае нужно нажать на иконку в образе папки или применить все то же Ctrl+O.
В блоке «Параметра разделителя» ставьте радиокнопку около пункта «Разделитель», после чего отметьте флажком тот пункт («Точка с запятой» или «Запятая»), который соответствует типу разделителя в документе.
Побеждаем порчу данных правильным импортом
Если серьезно, в бедах виноват не Excel целиком, а неочевидный способ импорта данных в программу.
По умолчанию Excel применяет к данным в загруженном CSV-файле тип «General» — общий. Из-за него программа распознает цифровые строки как числа. Такой порядок можно победить, используя встроенный инструмент импорта.
Запускаю встроенный в Excel механизм импорта. В меню это «Data → Get External Data → From Text».
Выбираю CSV-файл с данными, открывается диалог. В диалоге кликаю на тип файла Delimited (с разделителями). Кодировка — та, что в файле, обычно определяется автоматом. Если первая строка файла — шапка, отмечаю «My Data Has Headers».
Перехожу ко второму шагу диалога. Выбираю разделитель полей (обычно это точка с запятой — semicolon). Отключаю «Treat consecutive delimiters as one», а «Text qualifier» выставляю в «». (Text qualifier — это символ начала и конца текста. Если разделитель в CSV — запятая, то text qualifier нужен, чтобы отличать запятые внутри текста от запятых-разделителей.)
На третьем шаге выбираю формат полей, ради него все и затевалось. Для всех столбцов выставляю тип «Text». Кстати, если кликнуть на первую колонку, зажать шифт и кликнуть на последнюю, выделятся сразу все столбцы. Удобно.
Дальше Excel спросит, куда вставлять данные из CSV — можно просто нажать «OK», и данные появятся в открытом листе.
Перед импортом придется создать в Excel новый workbook
Но! Если я планирую добавлять данные в CSV через Excel, придется сделать еще кое-что.
После импорта нужно принудительно привести все-все ячейки на листе к формату «Text». Иначе новые поля приобретут все тот же тип «General».
- Нажимаю два раза Ctrl+A, Excel выбирает все ячейки на листе;
- кликаю правой кнопкой мыши;
- выбираю в контекстном меню «Format Cells»;
- в открывшемся диалоге выбираю слева тип данных «Text».
Чтобы выделить все ячейки, нужно нажать Ctrl+A два раза. Именно два, это не шутка, попробуйте
После этого, если повезет, Excel оставит исходные данные в покое. Но это не самая твердая гарантия, поэтому мы после сохранения обязательно проверяем файл через текстовый просмотрщик.
Рассмотрим загрузку CSV файла через утилиту bcp
При загрузке CSV файла, приведенного в примере, через утилиту bcp или операцией BULK INSERT мы можем получить несколько ошибок. Например, выполним команду:
После этого загрузим снова наш файл с помощью той же команды и получим результат
Первая строка с заголовком загрузилась верно. А на второй строке в поле column4 мы видим только "Это пример, хотя должны были увидеть Это пример "многострочного" примечания с двойными кавычками:
Способ 2: LibreOffice Calc
Запускать CSV умеет и другой табличный процессор – Calc, входящий в сборку LibreOffice.
-
Запустите LibreOffice. Щелкайте «Открыть файл» или воспользуйтесь Ctrl+O.
Также можете произвести переход через меню, нажав «Файл» и «Открыть…».
Кроме того, в окно открытия можно попасть и непосредственно через интерфейс Calс. Для этого, находясь в LibreOffice Calc, щелкайте по значку в виде папки или наберите Ctrl+O.
Сразу перейдите к группе настроек «Импорт». В области «Кодировка» выбирайте значение «Юникод (UTF-8)», если там отображается иное. В области «Язык» выберите язык текста. В области «Со строки» нужно указать, с какой именно строчки следует начинать импорт содержимого. В большинстве случаев в этот параметр изменение вносить не нужно.
Далее переходим к группе «Параметры разделителя». Прежде всего, необходимо установить радиокнопку в позицию «Разделитель». Далее по такому же принципу, который был рассмотрен при использовании Эксель, нужно указать, установив флажок напротив определенного пункта, что именно будет играть роль разделителя: точка с запятой или запятая.
«Другие параметры» оставляем без изменений.
Способ 6. Memory Mapped Files
Этот способ я выбрал напоследок, чтобы проверить его на деле. Данный способ бывает полезен, если нужно работать с файлом параллельно из нескольких потоков или процессов. На практике я его никогда не использовал, но в свои тесты добавил. По результатам видно, что памяти потребляется почти столько же (немного меньше), чем размер файла.
Способ 2: использование Мастера текстов
Импортировать данные из документа формата CSV можно при помощи встроенного инструмента Excel, который называется Мастер текстов.
-
Запускаем программу Эксель и переходим во вкладку «Данные». На ленте в блоке инструментов «Получение внешних данных» щелкаем по кнопке, которая называется «Из текста».
Способ 5. fastCSV
Подробности описания данного метода см. здесь. Проект выложен на github. Исходники данной библиотеки работают по такому же принципу, как и FileHelpers (способ 4), т.е. обрабатывается файл целиком и нужно заранее создать класс и описать все свойства для маппинга. Так как код этой библиотеки не сложный и он показал значительно лучшую производительность по сравнению с FileHelpers (см. "original" в таблице сравнения результатов), то я изменил код и сделал методы чтения CSV построчно, без маппинга в класс (см. "inline" в таблице сравнения результатов). Код fastCSV с методом "inline" можете скачать из исходников (см. ссылку в конце статьи).
В итоге, для тестового CSV файла размером 795Мб, данный способ оказался самым быстрым и менее затратным по CPU и оперативной памяти. С помощью этой библиотеки действительно можно значительно повысить скорость чтения CSV.
В случае, если необходимо маппить CSV с объектом, то этот вариант в 2 раза быстрее, чем FileHelpers и менее затратный в памяти, чем FileHelpers.
Способ 4: Блокнот
Для редактирования можно применять обычный Блокнот.
-
Запустите Блокнот. В меню щелкайте «Файл» и «Открыть…». Или можете применить Ctrl+O.
Бонус-трек: проблемы при сохранении из Calc в .xlsx
Если сохраняете данные из Calc в экселевский формат .xlsx, имейте в виду — OO порой необъяснимо и масштабно теряет данные.
Белая пустошь, раскинувшаяся посередине, в оригинальном CSV-файле богато заполнена данными
Поэтому после сохранения я еще раз открываю файл и убеждаюсь, что данные на месте.
Если что-то потерялись, лечение — пересохранить из CSV в .xlsx. Или, если установлен Windows, импортнуть из CSV в Excel и сохранить оттуда.
После пересохранения обязательно еще раз проверяю, что все данные на месте и нет лишних пустых строк.
Если интересно работать с данными, посмотрите на наши вакансии. HFLabs почти всегда нужны аналитики, тестировщики, инженеры по внедрению, разработчики. Данными обеспечим так, что мало не покажется :)
Текстовые документы формата CSV применяются многими компьютерными программами для обмена данными между друг другом. Казалось бы, что в Экселе можно произвести запуск такого файла стандартным двойным кликом по нему левой кнопкой мыши, но далеко не всегда в таком случае данные отображаются корректно. Правда, есть другой способ просмотреть информацию, содержащуюся в файле CSV. Давайте узнаем, как это можно сделать.
Читайте также: