Как преобразовать файл csv в xml

Обновлено: 30.06.2024

Я хочу конвертировать CSV-файл в XML-файл с Python. Я хочу сгруппировать одинаковые идентификаторы в CSV-файл вместе и преобразовать CSV в преобразовать XML (см. Желаемый результат). Это немного сложнее, чем с отступом, циклом и группировкой csv в xml. Вся помощь приветствуется.

Желаемый результат должен быть:

3 ответа

Я бы сделал что-то очень похожее на то, что предложил @Parfait; используйте csv.DictReader и lxml для создания XML.

Однако чего-то не хватает в этом ответе; элементы surface не сгруппированы по id .

Если мне нужно сгруппировать XML во время преобразования, первое, о чем я думаю, это XSLT.

Как только вы это освоите, с XSLT легко группировать; особенно 2.0 или выше. К сожалению, lxml поддерживает только XSLT 1.0. В версии 1.0 вам необходимо использовать Muenchian Grouping.

Вот полный пример создания промежуточного XML и преобразования его с помощью XSLT.

XSLT 1.0 (test.xsl)

Python

Вывод XML (test.xml)

Сначала прочитайте все строки из CSV и отсортируйте их.

Позже вы можете использовать переменную previous_id , чтобы открывать и закрывать Roughness-Profile / surfaces только тогда, когда id в новой строке отличается от предыдущей.

Я использовал StringIO для симуляции CSV-файла и sys.stdout для симуляции XML-файла - чтобы каждый мог скопировать код и запустить его, чтобы посмотреть, как он работает

Версия без StringIO и sys.stdout

Поскольку XML-файлы - это не текстовые файлы, а специальные текстовые документы со структурированными данными, соответствующие спецификациям W3C , избегая построения документа путем конкатенации строк.

Вместо этого используйте соответствующие библиотеки DOM, доступные практически на всех современных языках программирования, включая Python со встроенным xml.etree или более надежным сторонним модулем lxml . Фактически, поскольку желаемый вывод включает группирование узлов по id , рассмотрите возможность запуска XSLT, языка специального назначения, предназначенного для преобразования файлов XML. Модуль lxml может запускать сценарии XSLT 1.0.

Ниже используется DictReader встроенного модуля csv для создания вложенного словаря идентификаторов (все столбцы сгруппированы под ключами идентификаторов). Затем XML создается путем перебора содержимого этого словаря для записи данных в узлы элемента.

You are attempting to upload a file that exceeds our 50MB free limit.

You will need to create a paid Zamzar account to be able to download your converted file. Would you like to continue to upload your file for conversion?

Files to Convert

Overall conversion/upload progress:

Вы в хорошей компании:
Zamzar конвертировал около 510 миллионов файлов начиная с 2006 года

CSV (Document)

Расширение файла .csv
Категория Document File
Описание Файл CSV - это способ сбора данных из любой таблицы, так что она может быть передана в качестве в другое таблично ориентированное приложение, такое как приложения реляционных баз данных. Microsoft Excel, таблица или приложение реляционная база данных, могут читать CSV файлы.CSV-файл иногда называют плоским файлом.
Действия CSV в XML - Конвертировать файл сейчас
View other document file formats
Технические детали В компьютерах, файл CSV содержит различные значения в таблице в виде серии ASCII (American Standard Code for Information Interchange) строк текста, которые затем организовали так, что каждое значение столбца отделяется запятой от следующего значения столбцов и каждая строка начинает новую строку. CSV является одним из примеров текстового файла с разделителями, который использует запятые для разделения значений (многие другие реализации CSV позволяют различным сепараторы, такие как слеши). Однако CSV отличается от других разделенные между собой форматов в использовании двойных кавычек вокруг полей, содержащих зарезервированные символы (например, запятыми или символами новой строки). Преимущество этого подхода заключается в том, что он позволяет передачу данных между различными приложениями.
Ассоциированные программы The CSV file format is very simple and supported by almost all spreadsheets and database management systems
Разработано Microsoft
Тип MIME text/comma-separated-values
Полезные ссылки Более детальная информация о CSV-файлах
Как использовать CSV-файлы
Программы, которые открывают CSV-файлы
CSV Converter

XML (Document)

Расширение файла .xml
Категория Document File
Описание XML это тип файла, содержащий язык разметки. Он доступен для чтения как человеком-пользователем, так и приложениями. Разработанный, чтобы быть хранилищем данных, а не отображать данные, он является независимым от платформы языком и позволяет пользователям определять свои собственные тэги. Его мобильность и независимость от поставщиков сделали этот язык чрезвычайно популярным форматом файлов, особенно в сети. XML позволяет определять структуру данных, которая позволяет другим приложениям интерпретировать и обрабатывать данные внутри XML файлов. XML считается таким же важным для сети, как и HTML.
Действия Convert XML file
View other document file formats
Технические детали Все файлы .XML содержат базовую структуру, в рамках которой пользователи могут определять свои собственные тэги. Каждый файл начинается с того, что называется декларацией XML. Это определяет версию и кодировку внутри самого файла. Затем файл должен определить корневой элемент, известный также как родительский элемент. Затем, корневой элемент получает дочерний элемент (ы). Все тэги в XML-файла должны иметь соответствующий закрывающий тэг. XML-файлы могут содержать комментарии, ссылки на объекты и атрибуты. Затем могут быть разработаны приложения для извлечения значений внутри файла и их представления по желанию.
Ассоциированные программы Chrome
Firefox
Microsoft Internet Explorer
Microsoft Office InfoPath
Notepad
Oxygen XML Editor
Safari
Разработано World Wide Web Consortium
Тип MIME application/xml
application/x-xml
text/xml
Полезные ссылки Подробнее о XML
Учебник XML от «W3Schools»
Официальная документация от «W3C»
Convert XML file

Преобразование файлов CSV

Используя Zamzar можно конвертировать файлы CSV во множество других форматов

На веб-сайте сообщества по конвертации есть ссылка на инструмент командной строки csv2xml . Поскольку он не поддерживается, вы можете выбрать другой вариант.

Также упоминается инструмент Java под названием csv2xml (предупреждение: сайт на немецком языке) и инструмент командной строки с именем ff-extractor .

Ссылка также содержит ссылки на Python, Perl, PHP, XSLT, но это означает, что вам нужно кодировать конвертер самостоятельно.

Когда вы знаете формат csv файла и структуру, которая вам нужна в xml файле, довольно просто создать сценарий, который может обработать преобразование.

Возьмите файл simple.csv :

Вы можете создать следующий xml файл:

С помощью следующего скрипта:

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

IFS является внутренним спецификатором поля. IFS=$',' Заявляет , что значение разделителя полей является запятой. Это стандартно для файла CSV, но при необходимости его можно изменить в соответствии с форматом входного файла.

-r Аргумент read команды говорит это , чтобы рассматривать любые обратные слэша в файл как часть ваших данных , а не как побег для следующего специального символа.

-a arry Аргумент помещает каждый столбец файла в массив ( с именем arry ). Столбцы в этом примере: имя, возраст, страна. Другими словами значения между запятыми. Таким образом, каждый столбец в строке хранится в массиве.

Затем нужный текст xml просто оборачивается вокруг значений и xml строка добавляется в выходной файл с помощью echo .

@chaskes, если вы объясните опцию, используемую в строке while IFS=$',' read -r -a arry , это полезно для другого. Спасибо. Как бы вы справились с запятыми в полях, окруженных двойными кавычками? Как на "Somename, Jack" месте Jack во входном файле? @ muk.li Разделитель поля ввода (обычно запятая) отмечается в начале строки: while IFS = $ ','. Допустим, разделитель является звездочкой, вы просто измените его на: $ '*'. Итак, в вашем случае, это должно быть $ '"' (одинарная кавычка, двойная кавычка, одинарная кавычка). Это должно работать нормально, но цитирование в оболочке может стать хитрым, и у меня не было возможности проверить это.

Довольно удобное для пользователя (т. Е. Простое для таких, как я) решение проблемы преобразования CSV в XML заключается в использовании хорошего кроссплатформенного редактора XML, в который встроена эта функция. (Я использовал его под Ubuntu и Mac OSX 10.10.5; у него также есть исполняемый файл Windows.)

XMLSpear

Как уже упоминалось, это редактор XML, но он включает в себя «импорт» CSV-to-XML (и Excel-to-XML) в своем главном меню:

введите описание изображения здесь

Он конвертировал для меня 31-мегабайтный CSV-файл (дамп из базы данных библиотеки из 20 000 записей) примерно за 15 секунд, что дало мне правильно сформированный XML-файл для сохранения и манипулирования.

В качестве редактора у него есть много других полезных функций (подробности по ссылке выше). Я не могу найти упоминание о какой-либо лицензии для него, но это включено в «README»:

Здравствуйте. Реализовал конвертацию следующим образом:

В конце получаю правильную структуру, но заполненую неправильными данными. Пример структуры:

Причина неправильного заполнения в черезмерной насыщенности текста элементом ; , есть ли возможность, на основании текущего кода, реализовать правильную конвертацию? Или какие варианты реализации целесообразно использовать в данной ситуации.

Обновление

Приведу полную версию кода для уточнение правильности чтения CSV с помощью CSVHelpera (имею проблему с выводом в XML, выводится только одна линия из CSV файла):

Т.е. у Вас в тексте встречается никак не экранированный разделитель? Да, к примеру с номерами телефонв: (22) 333 55 55 ; (22) 333 55 77, они в одной ячейке, но между ними разделитель ; Соблюдается ли "Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками ("); если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд." ? @IgKos: Последняя проблема в конструкторе StreamWriter : вы указали вторым параметром false , то есть запретили ему дописывать к старому файлу. Вот он каждый раз и затирает предыдущую строку новой.

Пожалуйста, прекратите обрабатывать CSV файлы "руками"!

CSV не так прост как кажется. Из самых частых проблем:

  • наличие сепаратора внутри значений ячеек ("some;data")
  • наличие переноса строк внутри значений ячеек (причем переносы разных форматов -- Windows, Unix, Mac)
  • наличие двойных кавычек внутри экранированных значений ячеек ("some""data")

Поэтому этом даже при наличии правильно сформированного файла тривиальное решение -- разбить его на строки, а каждую строку разбить string.Split()'ом -- не является корректным.

Используйте готовую библиотеку, авторы которой позаботились о закавыках формата. Например, CsvHelper. Как крайний вариант (если вдруг не устроит производительность готовых библиотек или у вас какой-то кастомный CSV), можно написать свой парсер, который обработает самые распространенные проблемы (пример черновика парсера с использованием конечного автомата).

Читайте также: