Batch file 如何以csv格式保存xml解析输出结果
下面批处理脚本读取xml文件并提取所需的标记/值,并将它们保存在输出文件中,但问题是,所有所需的标记值都会在A列中一个接一个地保存。我希望每个标记值都存储在相应的标记头中。非常感谢您的帮助 xml输入文件内容:Batch file 如何以csv格式保存xml解析输出结果,batch-file,Batch File,下面批处理脚本读取xml文件并提取所需的标记/值,并将它们保存在输出文件中,但问题是,所有所需的标记值都会在A列中一个接一个地保存。我希望每个标记值都存储在相应的标记头中。非常感谢您的帮助 xml输入文件内容: <RIMP> <HSI> <SN>Pro Gen8</SN> <SP>Podt1</SP> <UUID>ILD9V</UUID> <VIRTUAL> <PN>Inte
<RIMP>
<HSI>
<SN>Pro Gen8</SN>
<SP>Podt1</SP>
<UUID>ILD9V</UUID>
<VIRTUAL>
<PN>Inte 4</PN>
<VID>
<BSN></BSN>
<TYPE>Admin</TYPE>
</VID>
</VIRTUAL>
<PRODUCTID> 9A </PRODUCTID>
<NICS>
<NIC>
<PORT>1</PORT>
<MACADDR></MACADDR>
</NIC>
</RIMP>
但我试图获得以下输出:
SN,UUID,PN,TYPE
Pro Gen8,ILD9V,Inte 4,Admin
使用DavidPostill代码后,我现在得到的预期输出如下:
SN,UUID,PN,TYPE
Pro Gen8,ILD9V,Inte 4,Admin
如何将服务器ip/info添加为csv文件的第一列(服务器信息取自serverlist文件)
David的代码实现了这一点,任何人都需要关于csv格式输出的答案,然后我建议您务必查看下面David的回复 我希望每个标记值都存储在各自的标记头中
假设您实际想要一个CSV文件作为输出,使用以下批处理文件
test.cmd:
@echo off
setlocal enabledelayedexpansion
set inFile="C:\output\input.xml"
set outFile="C:\output.csv"
set req_tags=SN UUID PN TYPE
set outLine=
echo SN,UUID,PN,TYPE > %outFile%
for %%a in (%inFile%) do (
for %%c in (%req_tags%) do (
set search_tag=%%c
for /f "tokens=2 delims=>< " %%b in ('type "%%a" ^|findstr /i !search_tag!' ) do (
if [%%b] NEQ [] (
rem we don't want to match /BSN
if [%%b] NEQ [/BSN] (
set outline=!outline!%%b,
)
)
)
)
)
rem output the values
rem remove trailing ,
set outline=%outline:~0,-1%
echo %outline%>>"%outFile%"
endlocal
进一步阅读
- -对于所有与Windows命令行相关的内容都是一个很好的参考
- -延迟扩展将导致变量在执行时而不是在解析时扩展
- -有条件地执行命令数次李>
- -有条件地对多个文件执行命令
- -循环命令:针对一组文件-有条件地对每个项目执行命令
- -提取变量的一部分(子字符串)
,
。。。您还需要向我们展示XML输入数据。。。一般来说,我推荐另一种本机支持XML解析的语言,因为像批处理文件一样将其视为普通文本非常麻烦而且容易出错……我从excel复制了输出文件内容,所以看不到逗号。我已经更新了最初的帖子,加入了xml输入文件内容。所以用文本编辑器复制CSV数据吧!aschipfl,我所做的就是获取输出,这样,当用户可以使用电子表格过滤器选项过滤结果时。很抱歉,csv可能会在此处造成混淆。我很抱歉,舒尔您不希望输出与此处显示的完全一致(查看第1列和第2列);非常漂亮,请用文本编辑器复制数据,以便清晰可见…谢谢David。你对我努力实现的目标的理解是正确的。对于您的代码,一切正常,但发现第一个req_标记值显示了两次,不知道为什么。我更新了原始帖子,以显示得到了什么输出now@Prime我无法用你问题中的测试文件重现。对不起,大卫。我的错误是,我重新运行了your代码,这次它在输出csv文件中没有重复任何第一个标记值。再次感谢。是否可以将服务器ip/info添加为csv文件中的第一个标头,因为我需要为多个服务器运行此脚本,因此,如果csv文件中没有服务器ip/info,则很难说哪行值对应于哪台服务器。我从serverlist文件中读取了服务器信息。当然这是可能的。例如,您可以添加一个额外的封装for循环,以echo
s服务器信息。如果你被卡住了,请问一个新问题,必要时参考这个问题的上下文。只需添加一个链接(并说明添加链接的原因)。
SN,UUID,PN,TYPE
Pro Gen8,ILD9V,Inte 4,Admin
Server,SN,UUID,PN,TYPE
11.12.13.14,Pro Gen8,ILD9V,Inte 4,Admin
@echo off
setlocal enabledelayedexpansion
set inFile="C:\output\input.xml"
set outFile="C:\output.csv"
set req_tags=SN UUID PN TYPE
set outLine=
echo SN,UUID,PN,TYPE > %outFile%
for %%a in (%inFile%) do (
for %%c in (%req_tags%) do (
set search_tag=%%c
for /f "tokens=2 delims=>< " %%b in ('type "%%a" ^|findstr /i !search_tag!' ) do (
if [%%b] NEQ [] (
rem we don't want to match /BSN
if [%%b] NEQ [/BSN] (
set outline=!outline!%%b,
)
)
)
)
)
rem output the values
rem remove trailing ,
set outline=%outline:~0,-1%
echo %outline%>>"%outFile%"
endlocal
F:\test>test
F:\test>type C:\output.csv
SN,UUID,PN,TYPE
Pro Gen8,ILD9V,Inte 4,Admin
F:\test>