Board logo

标题: [文本处理] 求助批处理从一堆XML中提取所有关键词写到一个csv中 [打印本页]

作者: zhengwei007    时间: 5 天前 18:29     标题: 求助批处理从一堆XML中提取所有关键词写到一个csv中

我有N个XML碎文件,我希望把这些碎文件内容全部整理到一个csv中,方便我导入数据库。我挑几个例子展示,大概样式如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
  3. <npc id="20001" level="1" type="Monster">
  4. <!-- Confirmed CT2.5 -->
  5. <parameters>
  6. <param name="MoveAroundSocial" value="0" />
  7. <param name="MoveAroundSocial1" value="0" />
  8. <param name="MoveAroundSocial2" value="0" />
  9. </parameters>
  10. <race>FAIRY</race>
  11. <sex>MALE</sex>
  12. <acquire exp="29" sp="2" />
  13. <stats str="40" int="21" dex="30" wit="20" con="43" men="20">
  14. <vitals hp="39.74519" hpRegen="2" mp="40.0" mpRegen="0.9" />
  15. <attack physical="8.47458" magical="5.78704" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
  16. <defence physical="44.44444" magical="29.5916164000214" />
  17. <attribute>
  18. <defence fire="20" water="20" wind="53" earth="20" holy="20" dark="20" />
  19. </attribute>
  20. <speed>
  21. <walk ground="20" />
  22. <run ground="50" />
  23. </speed>
  24. <hitTime>370</hitTime>
  25. </stats>
  26. <status undying="false" canBeSown="true" />
  27. <skillList>
  28. <skill id="4408" level="1" />
  29. <skill id="4409" level="1" />
  30. <skill id="4410" level="11" />
  31. <skill id="4411" level="11" />
  32. <skill id="4412" level="11" />
  33. <skill id="4413" level="11" />
  34. <skill id="4414" level="2" />
  35. <skill id="4415" level="3" />
  36. <skill id="4416" level="13" />
  37. </skillList>
  38. <exCrtEffect>false</exCrtEffect>
  39. <ai aggroRange="1000" clanHelpRange="300" isAggressive="false" />
  40. <collision>
  41. <radius normal="10" />
  42. <height normal="15" />
  43. </collision>
  44. </npc>
  45. <npc id="20003" level="5" type="Monster" name="Goblin">
  46. <!-- Confirmed CT2.5 -->
  47. <parameters>
  48. <param name="MoveAroundSocial" value="42" />
  49. <param name="MoveAroundSocial1" value="42" />
  50. <param name="MoveAroundSocial2" value="42" />
  51. </parameters>
  52. <race>HUMANOID</race>
  53. <sex>MALE</sex>
  54. <equipment rhand="4" /> <!-- rhand: Club -->
  55. <acquire exp="178" sp="5" />
  56. <stats str="40" int="21" dex="30" wit="20" con="43" men="20">
  57. <vitals hp="80.17319" hpRegen="2" mp="69.6" mpRegen="0.9" />
  58. <attack physical="12.34006" magical="8.42666" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
  59. <defence physical="51.60553" magical="34.3595464531323" />
  60. <attribute>
  61. <defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
  62. </attribute>
  63. <speed>
  64. <walk ground="40" />
  65. <run ground="110" />
  66. </speed>
  67. <hitTime>320</hitTime>
  68. </stats>
  69. <status undying="false" canBeSown="true" />
  70. <skillList>
  71. <skill id="4408" level="1" /> <!-- HP Increase (1x) -->
  72. <skill id="4409" level="1" /> <!-- MP Increase (1x) -->
  73. <skill id="4410" level="11" /> <!-- Average P. Atk. -->
  74. <skill id="4411" level="11" /> <!-- Average M. Atk. -->
  75. <skill id="4412" level="11" /> <!-- Average P. Def. -->
  76. <skill id="4413" level="11" /> <!-- Average M. Def. -->
  77. <skill id="4414" level="2" /> <!-- Standard Type -->
  78. <skill id="4415" level="5" /> <!-- Blunt Weapons -->
  79. <skill id="4416" level="6" /> <!-- Humanoids -->
  80. </skillList>
  81. <exCrtEffect>false</exCrtEffect>
  82. <ai aggroRange="1000" clanHelpRange="300" isAggressive="false">
  83. <clanList>
  84. <clan>GOBLIN</clan>
  85. </clanList>
  86. </ai>
  87. <dropLists>
  88. <drop>
  89. <item id="57" min="30" max="42" chance="70" /> <!-- Adena -->
  90. <item id="112" min="1" max="1" chance="10.2689266243744" /> <!-- Apprentice's Earring -->
  91. <item id="118" min="1" max="1" chance="7.65135117578888" /> <!-- Necklace of Magic -->
  92. <item id="116" min="1" max="1" chance="15.60872152845" /> <!-- Magic Ring -->
  93. <item id="1864" min="1" max="1" chance="1.95110591093254" /> <!-- Stem -->
  94. <item id="1865" min="1" max="1" chance="0.975552955466271" /> <!-- Varnish -->
  95. <item id="1866" min="1" max="1" chance="0.650366404044151" /> <!-- Suede -->
  96. <item id="1873" min="1" max="1" chance="0.390218502666473" /> <!-- Silver Nugget -->
  97. <item id="1868" min="1" max="1" chance="1.95110591093254" /> <!-- Thread -->
  98. <item id="1788" min="1" max="1" chance="0.780450402933121" /> <!-- Recipe: Bow -->
  99. <item id="8600" min="1" max="1" chance="23.1" /> <!-- Herb of Life -->
  100. <item id="8601" min="1" max="1" chance="15.96" /> <!-- Greater Herb of Life -->
  101. <item id="8602" min="1" max="1" chance="2.94" /> <!-- Superior Herb of Life -->
  102. <item id="8603" min="1" max="1" chance="5.5" /> <!-- Herb of Mana -->
  103. <item id="8604" min="1" max="1" chance="4.73" /> <!-- Greater Herb of Mana -->
  104. <item id="8605" min="1" max="1" chance="0.77" /> <!-- Superior Herb of Mana -->
  105. <item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
  106. <item id="8608" min="1" max="1" chance="5" /> <!-- Herb of Alacrity -->
  107. <item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
  108. <item id="10655" min="1" max="1" chance="5" /> <!-- Herb of Vampiric Rage -->
  109. <item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
  110. <item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
  111. <item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
  112. <item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
  113. <item id="8613" min="1" max="1" chance="0.33" /> <!-- Herb of the Mystic -->
  114. <item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
  115. <item id="8611" min="1" max="1" chance="10.34" /> <!-- Herb of Speed -->
  116. <item id="10657" min="1" max="1" chance="0.33" /> <!-- Herb of Doubt -->
  117. <item id="13028" min="1" max="1" chance="0.33" /> <!-- Vitality Replenishing Herb -->
  118. </drop>
  119. <spoil>
  120. <item id="1871" min="1" max="1" chance="5.6617" /> <!-- Charcoal -->
  121. <item id="116" min="1" max="1" chance="45.2932" /> <!-- Magic Ring -->
  122. <item id="1786" min="1" max="1" chance="4.5293" /> <!-- Recipe: Broad Sword -->
  123. </spoil>
  124. </dropLists>
  125. <collision>
  126. <radius normal="10" />
  127. <height normal="16.5" />
  128. </collision>
  129. </npc>
  130. </list>
复制代码
通过批处理输出结果如下:
  1. npc id npc level npc type name parameters MoveAroundSocial parameters MoveAroundSocial1 parameters MoveAroundSocial2 race sex acquire exp acquire sp stats str stats int stats dex stats wit stats con stats men vitals hp vitals hpRegen vitals mp vitals mpRegen attack physical attack magical attack random attack critical attack accuracy attack attackSpeed attack type attack range attack distance attack width defence physical defence magical defence fire defence water defence wind defence earth defence holy defence dark walk ground run ground hitTime undying canBeSown skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level skillList id skillList level exCrtEffect aggroRange clanHelpRange isAggressive clan radius normal height normal
  2. 20001 1 Monster 0 0 0 FAIRY MALE 29 2 40 21 30 20 43 20 39.74519 2 40 0.9 8.47458 5.78704 30 4 4.75 253 SWORD 40 80 120 44.44444 29.5916164 20 20 53 20 20 20 20 50 370 FALSE TRUE 4408 1 4409 1 4410 11 4411 11 4412 11 4413 11 4414 2 4415 2 4416 3 4417 13 FALSE 1000 300 FALSE 10 15
  3. 20003 5 Monster Goblin 42 42 42 HUMANOID MALE 178 5 40 21 30 20 43 20 80.17319 2 69.6 0.9 12.34006 8.42666 50 1 9 253 BLUNT 40 80 120 51.60553 34.35954645 20 20 20 20 20 20 40 110 320 FALSE TRUE 4408 1 4409 1 4410 11 4411 11 4412 11 4413 11 4414 2 4415 5 4416 6 FALSE 1000 300 FALSE GOBLIN 10 16.5
复制代码
文本里面如equipment、dropLists这两段内容不要,没有字段值的请留空,执行完成后直接转成csv就行,谢谢各位。
作者: czjt1234    时间: 4 天前 10:02

本帖最后由 czjt1234 于 2025-2-1 15:49 编辑
  1. rem 另存为 ANSI 编码 bat
  2. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* > out.csv & pause & exit /b
  3. Option Explicit
  4. Dim oDOMDocument, oWshShell, oFSO, p, i, a, f, n
  5. p = "."      '当前路径。可以指定其它路径,比如 d:\test\
  6. f = vbTab    'csv文件的分隔符
  7. n = 10       'skillList里面有10个skill。n必须≥2
  8. a = Array("@id", _
  9.           "@level", _
  10.           "@type", _
  11.           "@name", _
  12.           "parameters/param[@name='MoveAroundSocial' and @value]", _
  13.           "parameters/param[@name='MoveAroundSocial1' and @value]", _
  14.           "parameters/param[@name='MoveAroundSocial2' and @value]", _
  15.           "race", _
  16.           "sex", _
  17.           "acquire[@exp]", _
  18.           "acquire[@sp]", _
  19.           "stats[@str]", _
  20.           "stats[@int]", _
  21.           "stats[@dex]", _
  22.           "stats[@wit]", _
  23.           "stats[@con]", _
  24.           "stats[@men]", _
  25.           "stats/vitals[@hp]", _
  26.           "stats/vitals[@hpRegen]", _
  27.           "stats/vitals[@mp]", _
  28.           "stats/vitals[@mpRegen]", _
  29.           "stats/attack[@physical]", _
  30.           "stats/attack[@magical]", _
  31.           "stats/attack[@random]", _
  32.           "stats/attack[@critical]", _
  33.           "stats/attack[@accuracy]", _
  34.           "stats/attack[@attackSpeed]", _
  35.           "stats/attack[@type]", _
  36.           "stats/attack[@range]", _
  37.           "stats/attack[@distance]", _
  38.           "stats/attack[@width]", _
  39.           "stats/defence[@physical]", _
  40.           "stats/defence[@magical]", _
  41.           "stats/attribute/defence[@fire]", _
  42.           "stats/attribute/defence[@water]", _
  43.           "stats/attribute/defence[@wind]", _
  44.           "stats/attribute/defence[@earth]", _
  45.           "stats/attribute/defence[@holy]", _
  46.           "stats/attribute/defence[@dark]", _
  47.           "stats/speed/walk[@ground]", _
  48.           "stats/speed/run[@ground]", _
  49.           "stats/hitTime", _
  50.           "status[@undying]", _
  51.           "status[@canBeSown]", _
  52.           "skillList/skill[@id and @level]", _
  53.           "exCrtEffect", _
  54.           "ai[@aggroRange]", _
  55.           "ai[@clanHelpRange]", _
  56.           "ai[@isAggressive]", _
  57.           "ai/clanList/clan", _
  58.           "collision/radius[@normal]", _
  59.           "collision/height[@normal]")
  60. Set oDOMDocument = CreateObject("Msxml2.DOMDocument")
  61. Set oWshShell = CreateObject("WScript.Shell")
  62. Set oFSO = CreateObject("Scripting.FileSystemObject")
  63. p = oFSO.GetAbsolutePathName(p)
  64. oWshShell.CurrentDirectory = p
  65. For Each i In oFSO.GetFolder(p).Files
  66.     If LCase(oFSO.GetExtensionName(i)) = LCase("xml") Then Call t(i.Path)
  67. Next
  68. Sub t(ByVal file)
  69.     Dim s, i, x, oNode, oNodeList, m
  70.     oDOMDocument.load file
  71.     If oDOMDocument.parseError.errorCode <> 0 Then
  72.         wsh.Echo file & " Error!"
  73.         Exit Sub
  74.     End If
  75.     For Each oNode In oDOMDocument.documentElement.getElementsByTagName("npc")
  76.         s = ""
  77.         For Each i in a
  78.             Set oNodeList = oNode.SelectNodes(i)
  79.             x = ""
  80.             If oNodeList.length = 1 Then
  81.                 If Left(i, 1) ="@" Then
  82.                     x = oNodeList(0).value
  83.                 ElseIf UBound(Split(i, "@")) = 0 Then
  84.                     x = oNodeList(0).text
  85.                 ElseIf UBound(Split(i, "@")) = 1 Then
  86.                     x = RePlace(Split(i, "@")(1), "]", "")
  87.                     x = oNodeList(0).getAttribute(x)
  88.                 ElseIf UBound(Split(i, "@")) = 2 Then
  89.                     x = RePlace(Split(i, "@")(2), "]", "")
  90.                     x = oNodeList(0).getAttribute(x)
  91.                 Else
  92.                 End If
  93.             End If
  94.             If oNodeList.length > 1 Then
  95.                 For Each m In oNodeList
  96.                     x = x & m.getAttribute("id") & f & m.getAttribute("level") & f
  97.                 Next
  98.                 m = UBound(Split(x, f))
  99.                 x = x & String(n * 2 - m, f)
  100.                 x = Left(x, Len(x) - 1)
  101.             End If
  102.             s = s & x & f
  103.         Next
  104.         wsh.Echo s
  105.     Next
  106. End Sub
复制代码
楼主的输出结果把29.5916164000214输出为了29.5916164
这里采用批处理调用vbs,输出结果不会变




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