Объединить однотипные XML-файлы в один

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
uzlprog
Сообщения: 1
Зарегистрирован: 07 июн 2016, 22:25

07 июн 2016, 22:32

Короче, ситуация: есть очень много (несколько тысяч) однотипных .xml файлов со структурой, как в прикрепленном примере. Структура везде и всегда одна и та же.

Нужно их всех слепить в один полноценный файл.xml Но при этом, удалить из всех файлов в процессе сбора (так чтобы в итоговом не было) некоторые теги. Далее файл должен нормально читаться Exel.

При этом сделать нужно при помощи наиболее универсального (читай - легко редактируемого) средства - то есть как вариант на скрипте CMD, WSH/PoSH, и т.п.


ИЛИ - нужно свести некоторые данные (теги) из всех файлов в одну таблицу (любого читаемого простыми средствами Окон формата).

По дурости своей и ностальгии решил замутить все на обычном CMD, но застрял в процессе: как замутить чтение только части файла, откидывая сразу заголовки:

Код:

Код: Выделить всё

<?xml version="1.0" encoding="WINDOWS-1251"?>
-<journal>-
Есть и более простое решение: поместить все в тег <root>, но не уверен, что Exel переварит такой файл.

А как удалить по маске содержимое тега вместе с ним на голом CMD - вообще не знаю.

Решил смотреть в сторону разпарсинга кучи этих xml в таблицу на PowerShell, о в котором я страшный нубище)))

Накурил такой вот код:

Код:

Код: Выделить всё

$h = @{}

dir *.xml | Foreach {
	$obj = try {Import-Clixml $_.FullName} catch {$null} 
	foreach($i in $obj) {
		$h["$($i.Computer)"] += ,$i.ProcessName
	}
	$obj = $null
}

foreach ($c in $h.Keys) {
	$h[$c] | Group -NoElement | Select-Object @{n="passdate";e={$c}},@{n="id";e={$_.Name}},Count | 
		Export-CSV -Path D:\testxml.csv -Delimiter "`t" -Encoding UTF8 -NoTypeInformation
}

$h.Clear()
Ну что-то не покатило - ибо как вариант очень вероятный - я натупил...

Во общем прошу помощи в решении! Ибо задача срочная и очень объемная.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

12 июн 2016, 21:34

Я бы всё-таки не стал это делать на скрипте, так как, судя по размеру и количеству файлов, такой скрипт будет выполняться до конца света. Самым быстрым с точки зрения выполнения конечно же является компилируемая программа, которая просто открывает файлы, как текстовые, ищет по ключевым тегам и прямо кусками, не распаршивая весь остальной контент, вставляет текст в итоговый большой файл. Но тут, конечно же, потребуются знания в программировании...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Victo
Сообщения: 3
Зарегистрирован: 06 окт 2016, 14:32

06 окт 2016, 14:47

Ребята выручайте, надо объединить несколько файлов xml в один. Уже весь интернет "перерыл", но так и не нашёл ответа. Нашёл прогу которая сравнивает два файла (winmerge называется) и делает их одинаковыми (возможно я не нашёл как переносить данные с одного файла в другой), но мне надо добавить в один. Подскажите как это сделать.

п.с. я не программист
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

06 окт 2016, 15:02

Файлы нужно просто склеить или требуется интеллектуальная обработка данных?
Если просто склеить, то склеивать умеет даже простая консольная команда copy (посмотри синтаксис, использующий плюс).
Если же обычной склейки недостаточно, то нужно уже писать программу, здесь ничего не поделаешь.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Victo
Сообщения: 3
Зарегистрирован: 06 окт 2016, 14:32

06 окт 2016, 15:14

В файлах хранится информация от одного сайта. Недавно я сбрасывал систему и не сохранил файлы, так как думал на сервере инфа останется. Оказалось что нет. Мне восстановили файлы и теперь мне надо их скрепить. Восстановленные файлы я открывал на компе, вроде с виду такие же как и должны быть. Я так понимаю надо только скрепить. Попробую тем что ты посоветовал, но я вообще не программёр, даже блокнотом никогда не пользовался. Вообщем попробую - если что отпишусь.
Victo
Сообщения: 3
Зарегистрирован: 06 окт 2016, 14:32

06 окт 2016, 15:17

Не, я в этом не разберусь. Синтаксис да ещё на английском. Попроще ничё нет? Может какой-то редактор?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

06 окт 2016, 21:02

Да что там разбираться. Если есть файл file1.xml и file2.xml, и нужно их слить и записать результат в файл file_all.xml, то нужно написать следующую команду в командной строке:

Код: Выделить всё

copy file1.xml+file2.xml file_all.xml
Если файлов больше, то их можно добавлять в первый параметр через дополнительные плюсы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

02 ноя 2016, 17:36

Простое склеивание текстовых файлов в один здесь не подойдёт.
Сводный XML-файл должен иметь примерно такую структуру...

[HTML]<?xml version="1.0" encoding="utf-8"?>
<root>
<file1>Данные...</file1>
<file2>Данные...</file2>
<file3>Данные...</file3>
<file4>Данные...</file4>
<file5>Данные...</file5>

</root>[/HTML]Для этого нужно будет написать небольшой скрипт, который будет делать следующее:
- создать выходной XML-файл с заголовочной строкой и пустым корневым тегом.
- найти в указанном каталоге все файлы с расширением .XML, в итоге должен получиться список имён файлов.
- циклом поочерёдно открывать каждый исходный XML-файл и парсером читать данные из его корневого тега.
- добавлять в выходной XML-файл полученные данные в виде дочерних тегов (желательно присваивать каждому тегу уникальное имя).

Такая задачка легко решается на языках типа Java, Python, C#. Программисту средней квалификации на это хватит пары часов.
Но если человек не знаком с программированием, то ему самому это будет не под силу.
Лучше обратиться в раздел "Решите мне задачку" и предложить некоторое вознаграждение.
Ответить