21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
1

Можно ли средствами cmd объединить однотипные XML-файлы в один?

07.06.2016, 16:17. Показов 4095. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дано: очень много однотипных файлов xml вида:

XML
1
2
3
4
5
<?xml version="1.0" encoding="WINDOWS-1251"?>
-<journal>-<MainTable><id>xxx</id><carnumber>xxx</carnumber><videochan>xxx</videochan><channel_id>3</channel_id><passdate>2016-05-06T00:00:00</passdate><passtime>xxx</passtime><direction>xxx</direction><carimage><description>xxx</description><idArchivePath>xxx</idArchivePath></MainTable>
...
...
</journal>
Нужно в обозримые сроки объединить их в один файл, но для этого, нужно поместить содержимое всех файлов между тегами:

XML
1
2
3
4
5
<?xml version="1.0" encoding="WINDOWS-1251"?>
-<journal>
...
...
</journal>
Добавлено через 29 минут
Вылетел из сети... продолжу.

Короче, нужно как-то вырезать из каждого файла теги заголовка и конца и содержимое поместить в один файл.
А еще, очень бы хотелось возможность удалить из содержимого тег <videochan>xxx</videochan>

Добавлено через 3 часа 21 минуту
Возвращаюсь к теме. Кое-что уже сам сделал: создал пустой файл, добавил туда шапку xml, теперь задача составить цикл копирования содержимого каждого файла без этой шапки. Как я понимаю можно попытаться прочесть каждый файл без нескольких начальных символов и конечны? Или же можно вырезать ненужное по маске?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2016, 16:17
Ответы с готовыми решениями:

Можно ли средствами CMD создавать файлы MS Office?
Здравствуйте! Пишу скрипт для автоматизации создания проектов, где вложены некие каталоги,...

Объединить файлы xml в один и распарсить итог в таблицу
Задача - это некая идея фикс для меня, тем более очень для меня актуальна (нависает прям на до...

Как объединить Word .doc файлы средствами .NET
Есть 3 файла word .doc с разным содержимым и форматированием. Как с помощью Visual C# или Visual...

Можно ли реализовать функции COMDisable средствами cmd?
как вывести список используемых com портов, с указанием устройств?

15
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
07.06.2016, 17:07 2
Писанины много, но я чего-то так и не понял что надо. Лучше давайте так. Дайте пример, есть вот это..., а надо сделать вот это и так 333 раза.
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
07.06.2016, 17:44  [ТС] 3
Есть 2000 файлов формате .xml c одинаковой структурой, по типу:

XML
1
2
3
4
5
6
<?xml version="1.0" encoding="WINDOWS-1251"?>
<journal>
<MainTable><id>xxx</id><carnumber>xxx</carnumber><videochan>xxx</videochan><channel_id>3</channel_id><passdate>2016-05-06T00:00:00</passdate><passtime>xxx</passtime><direction>xxx</direction><carimage><description>xxx</description><idArchivePath>xxx</idArchivePath></MainTable>
...
...
</journal>
Нужно все эти 2000 файлов объединить в один! При этом желательно иметь возможность удалить тег, например, <videochan>xxx</videochan>.
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
07.06.2016, 19:41 4
Цитата Сообщение от uzlprog Посмотреть сообщение
удалить тег, например, <videochan>xxx</videochan>
"videochan", нигде больше не повторится или "<videochan>xxx</videochan>" стоит на одном и том же месте в строках или по разному, структура точно не меняется, можно просто сносить везде первых 2 и последнюю строку, удалять из внутренностей <videochan>xxx</videochan> и мешать в кучу в файл?
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
07.06.2016, 19:55  [ТС] 5
Структура файла везде одинаковая. "<videochan>xxx</videochan>" стоит на одном и том же месте в строках

XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="WINDOWS-1251"?>
<journal>
<MainTable><id>xxx</id><carnumber>xxx</carnumber><videochan>xxx</videochan><channel_id>3</channel_id><passdate>2016-05-06T00:00:00</passdate><passtime>xxx</passtime><direction>xxx</direction><carimage><description>xxx</description><idArchivePath>xxx</idArchivePath></MainTable>
...
<MainTable><id>xxx</id><carnumber>xxx</carnumber><videochan>xxx</videochan><channel_id>3</channel_id><passdate>2016-05-06T00:00:00</passdate><passtime>xxx</passtime><direction>xxx</direction><carimage><description>xxx</description><idArchivePath>xxx</idArchivePath></MainTable>
...
<MainTable><id>xxx</id><carnumber>xxx</carnumber><videochan>xxx</videochan><channel_id>3</channel_id><passdate>2016-05-06T00:00:00</passdate><passtime>xxx</passtime><direction>xxx</direction><carimage><description>xxx</description><idArchivePath>xxx</idArchivePath></MainTable>
...
</journal>
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
07.06.2016, 20:05  [ТС] 6
Вот пример файла
Вложения
Тип файла: zip пример.zip (1.7 Кб, 8 просмотров)
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
08.06.2016, 11:48  [ТС] 7
Сейчас подумал в иную сторону: разпарсить эту кучу файлов в таблицу по требуемым тегам... к примеру при помощи PowerShell

Но реализация на CMD очень любопытна))

Добавлено через 14 часов 12 минут
Задача с моим примером файла .xml как я понял фактически не реализуема на голом CMD, хотя теоретически, наверное, можно... Самый простой вариант - привести файл в построчный вид, а уже потом легко его резать по строкам.

Можно было бы добавить перед каждым '<' и '>' символ перехода строки... Только вот не помню чем чревато для xml запись вида:
XML
1
2
3
4
5
6
7
<?xml version="1.0" encoding="WINDOWS-1251"?>
<journal>
<MainTable>
<id>
xxx
</id>
</journal>
Вместо:
XML
1
2
3
4
5
<?xml version="1.0" encoding="WINDOWS-1251"?>
<journal>
<MainTable>
<id>xxx</id>
</journal>
По идее ни чем))
p.S.: возможно помучаю сегодня командную строку)))
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
08.06.2016, 14:14 8
Windows Batch file
1
2
3
4
5
6
7
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%A in ('dir/a-d/b "*.xml"') do (
 <"%%A">$ (for /f "tokens=1* delims=>" %%a in ('more') do @set "x=%%b"& set "x=!x:><=>,<!"& for %%c in (!x!) do @set "y=%%c"& for /f "delims=" %%d in ("!y!") do @echo %%d)
 <$>>"file.xml" (for /f "delims=" %%a in ('findstr/rv /c:"<journal>" /c:"<videochan>[0-9]*</videochan>" /c:"</journal>"') do @echo %%a)& del $
)
exit/b
проверялось - работает.

Добавлено через 2 минуты
Правда так и оставил строки массивом, но можно и в одну назад как было изначально, хотя на мое мнение так читабельнее.

Добавлено через 57 минут
Вот так в одну строку как в "Пример.xml":
Windows Batch file
1
2
3
4
5
6
7
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%A in ('dir/a-d/b "*.xml"') do (
 <"test.xml">$ (for /f "delims=" %%a in ('more') do @set "x=%%a"& set "x=!x:><=>","<!"& for %%b in ("!x!") do @set "y=%%~b"& echo !y!)
 <$>>"file.xml" (for /f "delims=" %%a in ('findstr/rv /c:"<journal>" /c:"<videochan>[0-9]*</videochan>" /c:"</journal>"') do @<nul set/p=%%a)& del $
)
exit/b
.

Добавлено через 43 секунды
Код чуть поменял, так лучше.
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
08.06.2016, 16:58  [ТС] 9
Цитата Сообщение от alpap Посмотреть сообщение
Windows Batch file
5
 <$>>"file.xml" (for /f "delims=" %%a in ('findstr/rv /c:"<journal>" /c:"<videochan>[0-9]*</videochan>" /c:"</journal>"') do @<nul set/p=%%a)& del $
[0-9]* - это маска значений?
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
09.06.2016, 08:37 10
Цитата Сообщение от uzlprog Посмотреть сообщение
[0-9]* - это маска значений?
любое количество любых цифр в том месте.

Добавлено через 8 часов 26 минут
В строке 4
Цитата Сообщение от alpap Посмотреть сообщение
<"test.xml">$
Заменить на
Windows Batch file
1
<"%%A">$ ...
ошибся случайно когда тестировал.
1
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
09.06.2016, 10:33  [ТС] 11
alpap, спасибо. Ошибочку я увидел, но вот с маской пока не разобрался. Во-первых, в этом теге (оффтоп: как же это правильно зовется в .xml?) хранится текст в кириллице, во-вторых, что-то не получается состряпать маску. А еще вопрос: как удалить несколько тегов? Я если честной не совсем вкурил 5 строку... в месте исполняемого действия...

Добавлено через 37 минут
alpap, по тестировал предложенный код: первый работает, а вот от второго результата не дождался. Так и не понял, что ему для счастья нужно?

Но, если подсунуть скрипту файл xml с объемным текстом в тегах (есть файл где символов на 4 Mb) то, понятное дело, конвертируется только часть, ибо ограничение объема переменных среды...

А если попробовать с файлом tmp и писать частями...

P.S.: понятное дело решение задачи на CMD - утопия, но если интересно...
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
09.06.2016, 10:42 12
Маску можете шире поставить
Windows Batch file
1
.../c:"videochan>.*</videochan>"...
любое количество любых символов
А принцип работы моего кода таков
Переводим одну строку в массив строк, это в 4й строке, попутно за счет пробелов в новой первой строке она сама удаляется, а остальные ненужные указываются в findstr/v и не выводятся, соответственно не пишутся в файл.

Добавлено через 2 минуты
Цитата Сообщение от uzlprog Посмотреть сообщение
P.S.: понятное дело решение задачи на CMD - утопия, но если интересно...
Вот только для интереса и сделал, это действительно не для cmd.
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
09.06.2016, 10:48  [ТС] 13
Спасибо. А удаление нескольких тегов одновременно?
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
09.06.2016, 11:04 14
Цитата Сообщение от uzlprog Посмотреть сообщение
А удаление нескольких тегов одновременно?
Не понял юмора, у меня, если присмотритесь, удаляется 3 тега одновременно, ставьте хоть 33.
0
21 / 24 / 1
Регистрация: 23.04.2012
Сообщений: 627
09.06.2016, 11:16  [ТС] 15
Все разобрался.
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
09.06.2016, 23:23 16
...Согласно пункту 1.5. правил batch раздела предлагается
утилита собственной разработки для объединения XML файлов с возможностью удаления тегов,
в виду, далее цитата, "целесообразности (затраты времени / надежность кода/..." - нужное подчеркнуть.
Использование:
Код
xmljoin --source=c:\test --dest=c:\test\new --name=new.xml
xmljoin -s=c:\test -d=c:\test\new
# c удалением одного или более тегов
xmljoin -d=new -t=deleted,deleted1,deleted2 -r=main -v
# с указанием XML декларации для шапки и имени корневого тега
xmljoin -d=new -r=main -x="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
PS: Утилита не имеет зависимостей, в том числе от NET.
xmljoin.rar
Ссылка на исходник.
4
09.06.2016, 23:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2016, 23:23
Помогаю со студенческими работами здесь

Объединить txt файлы в один
Добрый вечер. Начинал не так давно учиться программировать на VBA по работе нужно, сейчас...

Объединить файлы приложения в один
Здравствуйте. Работаю в Visual Studio 2010. Пишу программу в &quot;windows forms application&quot;. В...

Как объединить все файлы в один код?
На гитхабе нужный мне код разделен на 2 c-файла, и один h-файл. Можно ли как-то их собрать в один...

Как объединить все дополнительные файлы в один
есть 2 DLL , можно ли их соединить в одну?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru