Board logo

标题: [文本处理] 【已解决】批处理怎样从XML文件中提取2个关键词到CSV中? [打印本页]

作者: zhengwei007    时间: 2024-3-17 12:35     标题: 【已解决】批处理怎样从XML文件中提取2个关键词到CSV中?

本帖最后由 zhengwei007 于 2024-3-18 11:51 编辑

大概有几十个XML文件,希望从内容中的NPC中取一个ID,从AI TYPE中取一个aggro字段。仅提取这两个。代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <list>
  3. <npc id="13001" name="Heart of Warding" title="">
  4. <set name="level" val="70"/>
  5. <set name="radius" val="17"/>
  6. <set name="height" val="75"/>
  7. <set name="rHand" val="0"/>
  8. <set name="lHand" val="0"/>
  9. <set name="type" val="Folk"/>
  10. <set name="exp" val="490"/>
  11. <set name="sp" val="10"/>
  12. <set name="hp" val="2444.46819"/>
  13. <set name="mp" val="1345.8"/>
  14. <set name="hpRegen" val="7.5"/>
  15. <set name="mpRegen" val="2.7"/>
  16. <set name="pAtk" val="688.86373"/>
  17. <set name="pDef" val="295.91597"/>
  18. <set name="mAtk" val="470.40463"/>
  19. <set name="mDef" val="216.53847"/>
  20. <set name="crit" val="4"/>
  21. <set name="atkSpd" val="253"/>
  22. <set name="str" val="40"/>
  23. <set name="int" val="21"/>
  24. <set name="dex" val="30"/>
  25. <set name="wit" val="20"/>
  26. <set name="con" val="43"/>
  27. <set name="men" val="10"/>
  28. <set name="corpseTime" val="7"/>
  29. <set name="walkSpd" val="50"/>
  30. <set name="runSpd" val="120"/>
  31. <set name="dropHerbGroup" val="0"/>
  32. <ai type="DEFAULT" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="true" seedable="false"/>
  33. <skills>
  34. <skill id="4045" level="1"/>
  35. <skill id="4416" level="19"/>
  36. </skills>
  37. </npc>
  38. <npc id="27001" name="Orc Sniper" title="">
  39. <set name="level" val="10"/>
  40. <set name="radius" val="14"/>
  41. <set name="height" val="25"/>
  42. <set name="rHand" val="14"/>
  43. <set name="lHand" val="0"/>
  44. <set name="type" val="Monster"/>
  45. <set name="exp" val="0"/>
  46. <set name="sp" val="0"/>
  47. <set name="hp" val="163.28607"/>
  48. <set name="mp" val="108.4"/>
  49. <set name="hpRegen" val="2"/>
  50. <set name="mpRegen" val="0.9"/>
  51. <set name="pAtk" val="19.33758"/>
  52. <set name="pDef" val="61.82527"/>
  53. <set name="mAtk" val="13.20506"/>
  54. <set name="mDef" val="45.24105"/>
  55. <set name="crit" val="8"/>
  56. <set name="atkSpd" val="253"/>
  57. <set name="str" val="40"/>
  58. <set name="int" val="21"/>
  59. <set name="dex" val="30"/>
  60. <set name="wit" val="20"/>
  61. <set name="con" val="43"/>
  62. <set name="men" val="10"/>
  63. <set name="corpseTime" val="7"/>
  64. <set name="walkSpd" val="45"/>
  65. <set name="runSpd" val="110"/>
  66. <set name="dropHerbGroup" val="0"/>
  67. <ai type="ARCHER" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="true" seedable="false"/>
  68. <skills>
  69. <skill id="4416" level="6"/>
  70. </skills>
  71. </npc>
  72. <npc id="27002" name="Orc Fighter" title="">
  73. <set name="level" val="12"/>
  74. <set name="radius" val="12"/>
  75. <set name="height" val="22"/>
  76. <set name="rHand" val="1"/>
  77. <set name="lHand" val="0"/>
  78. <set name="type" val="Monster"/>
  79. <set name="exp" val="0"/>
  80. <set name="sp" val="0"/>
  81. <set name="hp" val="199.62322"/>
  82. <set name="mp" val="124.48"/>
  83. <set name="hpRegen" val="2.5"/>
  84. <set name="mpRegen" val="1.2"/>
  85. <set name="pAtk" val="22.99606"/>
  86. <set name="pDef" val="66.32989"/>
  87. <set name="mAtk" val="15.70333"/>
  88. <set name="mDef" val="48.53733"/>
  89. <set name="crit" val="4"/>
  90. <set name="atkSpd" val="253"/>
  91. <set name="str" val="40"/>
  92. <set name="int" val="21"/>
  93. <set name="dex" val="30"/>
  94. <set name="wit" val="20"/>
  95. <set name="con" val="43"/>
  96. <set name="men" val="10"/>
  97. <set name="corpseTime" val="7"/>
  98. <set name="walkSpd" val="45"/>
  99. <set name="runSpd" val="110"/>
  100. <set name="dropHerbGroup" val="0"/>
  101. <ai type="DEFAULT" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="100" canMove="true" seedable="false"/>
  102. <skills>
  103. <skill id="4416" level="6"/>
  104. </skills>
  105. </npc>
  106. <npc id="13036" name="Alchemist's Chest" title="">
  107. <set name="level" val="21"/>
  108. <set name="radius" val="8.5"/>
  109. <set name="height" val="8.5"/>
  110. <set name="rHand" val="0"/>
  111. <set name="lHand" val="0"/>
  112. <set name="type" val="Folk"/>
  113. <set name="exp" val="0"/>
  114. <set name="sp" val="0"/>
  115. <set name="hp" val="2880.37628"/>
  116. <set name="mp" val="1674.8"/>
  117. <set name="hpRegen" val="8.5"/>
  118. <set name="mpRegen" val="3"/>
  119. <set name="pAtk" val="894.75854"/>
  120. <set name="pDef" val="341.375"/>
  121. <set name="mAtk" val="611.00409"/>
  122. <set name="mDef" val="249.80341"/>
  123. <set name="crit" val="4"/>
  124. <set name="atkSpd" val="253"/>
  125. <set name="str" val="40"/>
  126. <set name="int" val="21"/>
  127. <set name="dex" val="30"/>
  128. <set name="wit" val="20"/>
  129. <set name="con" val="43"/>
  130. <set name="men" val="10"/>
  131. <set name="corpseTime" val="7"/>
  132. <set name="walkSpd" val="80"/>
  133. <set name="runSpd" val="1"/>
  134. <set name="dropHerbGroup" val="0"/>
  135. <ai type="DEFAULT" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="500" canMove="true" seedable="false"/>
  136. <skills>
  137. <skill id="4045" level="1"/>
  138. <skill id="4416" level="2"/>
  139. </skills>
  140. </npc>
  141. </list>
复制代码
看着内容挺多,但我只要两个字段,最终结果如下:
  1. NPCID aggro
  2. 13001 0
  3. 27001 0
  4. 27002 100
  5. 13036 500
复制代码
将结果输出到sour.csv中即可,谢谢
作者: wanghan519    时间: 2024-3-17 13:47

可以用xmlstarlet,对每个npc容器,输出id属性,输出ai子容器的aggro属性:
  1. xmlstarlet sel -t -m '//npc' -v './@id' -o , -v './ai/@aggro' -o $'\n' a.xml
复制代码
也可以用pwsh解析:
  1. #&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $x = New-Object System.Xml.XmlDocument
  3. $x.Load(".\a.xml")
  4. $x.list.npc | ForEach-Object {
  5.     $id = $_.id
  6.     $_.ai | ForEach-Object {
  7.         [PSCustomObject]@{npcId=$id;aggro=$_.aggro}
  8.     }
  9. } | Export-Csv -NoTypeInformation a.csv
复制代码

作者: ppll2030    时间: 2024-3-17 13:55

与xml文件放在同级目录下即可汇总生成sour.csv
  1. @echo off &setlocal enabledelayedexpansion
  2. (echo;NPCID, aggro
  3. for /f "delims=" %%x in ('dir /b /a-d "*.xml"') do (
  4. for /f "delims=" %%1 in (' findstr /ic:"npc id" /ic:"aggro" "%%x" ') do (
  5. for /f tokens^=1-12^delims^=^=^" %%a in ("%%1") do (
  6. set str=%%a&if "!str:~-6!" == "npc id" (set v1=%%b) else (echo !v1!, %%l)
  7. )
  8. )
  9. ))>sour.csv
  10. endlocal&exit/b
复制代码

作者: hfxiang    时间: 2024-3-17 14:41

回复 1# zhengwei007
用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )实现方式如下:
  1. gawk -v"FS=\042" "BEGIN{OFS=\"\t\";print \"NPCID\taggro\"}/^[\t ]*<npc id=/,/^[\t ]*<\/npc>$/{if(/^[\t ]*<npc id=/)A=$2;if(/aggro/)print A,$12}" *.xml>sour.csv
复制代码

作者: aloha20200628    时间: 2024-3-17 15:32

本帖最后由 aloha20200628 于 2024-3-17 15:50 编辑

回复 1# zhengwei007

用 for/f 一口气切分到位...
  1. @echo off&setlocal enabledelayedexpansion
  2. (echo,NPCID aggro&for /f "delims=" %%F in ('dir /s/b/a-d *.xml') do
  3. for /f tokens^=1-12^delims^=^ ^"^=^< %%a in (' findstr /ilc:"npc id=" /ilc:"aggro=" "%%~F" ') do (
  4. if /i "%%a"=="npc id" (set "v=%%b") else if /i "%%a"=="ai type" (echo,!v! %%l)
  5. ))>"sour.csv"
  6. endlocal&exit/b
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2