Блог компании Mail.Ru Group → Язвы и грабли CSV и Excel: проблемы и решения
CSV является стандартом де-факто для связи между собой разнородных систем, для передачи и обработки объемных данных с «жесткой», табличной структурой. Во многих скриптовых языках программирования есть встроенные средства разбора и генерации, он хорошо понятен как программистам, так и рядовым пользователям, а проблемы с самими данными в нем хорошо обнаруживаются, как говорится, на глаз.
История этого формата насчитывает не менее 30 лет. Но даже сейчас, в эпоху повального использования XML, для выгрузки и загрузки больших объемов данных по-прежнему используют CSV. И, несмотря на то, что сам формат довольно неплохо описан в RFC, каждый его понимает по-своему.
В этой статье я попробую обобщить существующие знания об этом формате, указать на типичные ошибки, а также проиллюстрировать описанные проблемы на примере кривой реализации импорта-экспорта в Microsoft Office 2007. Также покажу, как обходить эти проблемы (в т.ч. автоматическое преобразование типов Excel-ом в DATETIME и NUMBER) при открытии .csv.
История этого формата насчитывает не менее 30 лет. Но даже сейчас, в эпоху повального использования XML, для выгрузки и загрузки больших объемов данных по-прежнему используют CSV. И, несмотря на то, что сам формат довольно неплохо описан в RFC, каждый его понимает по-своему.
В этой статье я попробую обобщить существующие знания об этом формате, указать на типичные ошибки, а также проиллюстрировать описанные проблемы на примере кривой реализации импорта-экспорта в Microsoft Office 2007. Также покажу, как обходить эти проблемы (в т.ч. автоматическое преобразование типов Excel-ом в DATETIME и NUMBER) при открытии .csv.
MySQL → Простой импорт/экспорт в CSV для PHP & MySQL

В ходе разработки сервиса по расчете статистики по управлению запасами для интернет-магазинов возникла задача быстро организовать импорт/экспорт таблиц между разными MySQL серверами. Поскольку надо было сделать просто и прозрачно — оптимизация будет впереди — решил воспользоваться авторскими рекомендация из документации по MySQL 5.0.
Программирование → Пролог: База фактов из CSV файла
Импорт фактов в базу пролога из файла в формате CSV
Для того чтобы работать с фактами базы данных в прологе их (факты) необходимо импортировать из внешнего источника.

На схеме условно показаны три области активностей:
Желтая — подготовка промежуточного файла. Для простого импорта это может быть просто сохранение документа в формате CSV. Для работы по регламенту возможна настройка компонентов БД (например MS SQL Server Integration Services) для периодической выгрузки. Данная активность в статье не рассматривается.
Красная — импорт данных из CSV файла в базу фактов.
Зеленая — работа с базой фактов в Прологе.
Примечание. Стрелками показаны потоки данных.
Социальные сети → Расширение Google Chrome для экспорта контактов Facebook
Несмотря на давление со стороны Google и даже критику от Тима Бернерса-Ли, компания Facebook упорно отказывается предоставить своим пользователям функцию экспорта социального графа, то есть информации обо всех френдах в сети. Она получает заслуженные упрёки в том, что захватывает юзеров в «информационную ловушку», из которой они не могут выбраться.
Но если очень нужно, то выход всё-таки найдётся. Некий неизвестный разработчик dimator выпустил расширение для Google Chrome Facebook Doesn’t Own My Friends (исходный код), позволяющее легко экспортировать список друзей из Facebook в CSV-файл или напрямую в список контактов Gmail (там создаётся новая группа “Imported from Facebook”).
Но если очень нужно, то выход всё-таки найдётся. Некий неизвестный разработчик dimator выпустил расширение для Google Chrome Facebook Doesn’t Own My Friends (исходный код), позволяющее легко экспортировать список друзей из Facebook в CSV-файл или напрямую в список контактов Gmail (там создаётся новая группа “Imported from Facebook”).
Социальные сети → Facebook обошёл ограничения Google Contacts API
Несколько дней назад Google внёс изменения в Terms of Service программных интерфейсов Google Contacts API, так что теперь каждый, кто ими воспользуется, обязан гарантировать взаимность. Это был выпад в сторону Facebook, чтобы заставить их открыть социальный граф и наказать за протекционизм в области пользовательских данных. Не вышло. Вот как Facebook изменил сегодня форму поиска по контактам Gmail.


Системы управления версиями → Gource — визуализируем историю работы над проектом
Спешу рассказать хабрасообществу о, относительно новом, дьявольски завораживающем проекте Gource которое еще не упоминалось. Это приложение позволяет визуализировать историю изменений в системе контроля версии. Отрисовывает невероятно красиво при помощи OpenGL.
Персональные блоги → Ruby & Ccsv. FasterCSV не такой уж и faster
Предстала задача вытащить инфу с большого csv-файла (50 Мб).
Всегда пользовался FasterCSV, но так как он открывал этот файл больше минуты, начал поиски настоящего faster-а.
Без помощи гугла не обошлось.
Ccsv — быстрая и легкая либа для работы с Csv-файлами.
Ccsv реализован на C и подточен под Ruby. Как видите и разница во времени выполнения большая:
Всегда пользовался FasterCSV, но так как он открывал этот файл больше минуты, начал поиски настоящего faster-а.
Без помощи гугла не обошлось.
Ccsv — быстрая и легкая либа для работы с Csv-файлами.
Ccsv реализован на C и подточен под Ruby. Как видите и разница во времени выполнения большая:
Программирование → Покорим Ruby вместе! Капля одиннадцатая
Еще одна капля в наш стакан Руби (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Поговорим о
Описывая и обсуждая компьютерные программы, мы часто используем образные и человеческие метафоры. Например, мы говорим, что находимся в классе или возвращаемся из вызова метода. Иногда имеет смысл говорить во втором лице, например,
Некоторые объекты везде означают одно и тоже, например, числа и ключевые слова вроде
self, работе с CSV и обработке исключений.Описывая и обсуждая компьютерные программы, мы часто используем образные и человеческие метафоры. Например, мы говорим, что находимся в классе или возвращаемся из вызова метода. Иногда имеет смысл говорить во втором лице, например,
object.respond_to?("x"): “Эй, объект, ты ответишь на х? И пока программа интепретируется контекст меняется снова и снова. Некоторые объекты везде означают одно и тоже, например, числа и ключевые слова вроде
def и class. Однако значение большинства элементов зависит от контекста. MySQL → mysqldump в csv формате
Значится так — есть задача вытянуть данные из таблицы mysql в простенький csv файлик, дабы его открыть быстренько в excel. Зачем белым людям нужна такая магия — мне никогда не понять, но раз заказчик попросил, то я сделал. Итак, отдаёмся во власть консоли и пишем:
Вот и вся любовь (на выходе получим два файла — один с SQL и второй с CSV)
p.s. директория в которой выполняется эта команда должна быть открыта для записи, иначе оно ругаться будет ;)
mysqldump -u [USER_NAME] -p "--where=[WHERE]" "--fields-terminated-by=," "--tab=./" [DB_NAME] [TABLE] > [TABLE].txt
Вот и вся любовь (на выходе получим два файла — один с SQL и второй с CSV)
p.s. директория в которой выполняется эта команда должна быть открыта для записи, иначе оно ругаться будет ;)