2015-12-24 5 views
0

У меня есть много файлов XML со многими событиями. Любое событие имеют некоторые тег:Преобразование нескольких строк в одну строку

<v8e:Event> 
    <v8e:Level>Information</v8e:Level> 
    <v8e:Date>2015-12-22T16:18:17</v8e:Date> 
    <v8e:ApplicationName>1CV8</v8e:ApplicationName> 
</v8e:Event> 
<v8e:Event> 
    <v8e:Level>Information</v8e:Level> 
    <v8e:Date>2015-12-23T16:18:17</v8e:Date> 
    <v8e:ApplicationName>1CV28</v8e:ApplicationName> 
</v8e:Event> 

Я хочу, чтобы преобразовать эти стриктуры для этого:

Information, 2015-12-22T16:18:17, 1CV8 
Information, 2015-12-23T16:18:17, 1CV28 

Я знаю, как удалить XML-тег, но я не не знаю, как конкатенация другой строки в одном.

@echo от SETLOCAL EnableDelayedExpansion

(for /F "delims=" %%a in ('findstr /I /L "<v8e:Level> <v8e:Date> <v8e:ApplicationName>" *.xml') do (
    set "line=%%a" 
    set "line=!line:*<v8e:Level>=!" 
    set "line=!line:*<v8e:Date>=!" 
    set "line=!line:*<v8e:ApplicationName>=!" 
    for /F "delims=<" %%b in ("!line!") do echo %%b 
)) > 111.txt 

Как reuslt у меня есть:

Information 
2015-12-22T16:18:17 
1CV8 
Information 
2015-12-23T16:18:17 
1CV28 

И я также хочу, имя выходного файла же, как входной файл. Возможно, кто-то может остановить меня, чтобы решить эту проблему?

ответ

1

Вы близки:

@echo off 
setlocal EnableDelayedExpansion 

set "output=" 
set "fields=0" 
for /F "delims=" %%a in ('findstr /I /L "<v8e:Level> <v8e:Date> <v8e:ApplicationName>" *.xml') do (
    set "line=%%a" 
    set "line=!line:*<v8e:Level>=!" 
    set "line=!line:*<v8e:Date>=!" 
    set "line=!line:*<v8e:ApplicationName>=!" 
    for /F "delims=<" %%b in ("!line!") do set "line=%%b" 
    set "output=!output!!line!, " 
    set /A fields+=1 
    if !fields! equ 3 (
     set "file=%%a" 
     for /F "delims=:" %%b in ("!file!") do echo !output:~0,-2!>> "%%~Nb.txt" 
     set "output=" 
     set "fields=0" 
    ) 
) 

Однако это так, как я хотел бы сделать это:

@echo off 
setlocal EnableDelayedExpansion 

for %%f in (*.xml) do (

    set "output=" 
    set "fields=0" 
    (for /F "tokens=3 delims=<>" %%a in ('findstr /I /L "<v8e:Level> <v8e:Date> <v8e:ApplicationName>" "%%f"') do (
     set "output=!output!%%a, " 
     set /A fields+=1 
     if !fields! equ 3 (
     echo !output:~0,-2! 
     set "output=" 
     set "fields=0" 
    ) 
    )) > "%%~Nf.txt" 

) 
+0

Если я хочу изменить номер моего заявления? Для примера добавьте дополнительно 7 файлов: , что Ialso должно измениться в вашем скрипте? И что мне делать, если какое-то поле будет пустым? Например Информация 2015-12-23T16: 18: 17 hubba900

+0

Добавить дополнительные 7 полей: и добавьте 7 к 3 полям. Если какое-либо поле пусто, вы можете использовать tokens = 2,3 вместо 3, а если «%% b» neq »« (установите «output =! Output! %% b») else (установите «output =! Output! Empty» , ") вместо этого просто установите« output =! output! %% a », – Aacini