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

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

[复制链接]
发表于 2024-3-17 12:35:15 | 显示全部楼层 |阅读模式
本帖最后由 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中即可,谢谢
发表于 2024-3-17 13:47:33 | 显示全部楼层
可以用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
复制代码
发表于 2024-3-17 13:55:18 | 显示全部楼层
与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
复制代码
发表于 2024-3-17 14:41:36 | 显示全部楼层
回复 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
复制代码
发表于 2024-3-17 15:32:23 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 04:01 , Processed in 0.019732 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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