找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 10053|回复: 2

[文本处理] 【已解决】求助批处理从一堆XML中提取所有关键词写到一个csv中

[复制链接]
发表于 2025-1-31 18:29:30 | 显示全部楼层 |阅读模式
本帖最后由 zhengwei007 于 2025-2-7 10:55 编辑

我有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就行,谢谢各位。
发表于 2025-2-1 10:02:48 | 显示全部楼层
本帖最后由 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,输出结果不会变
 楼主| 发表于 2025-2-7 10:55:11 | 显示全部楼层
谢谢楼上,可以使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 10:00 , Processed in 0.018536 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表