Board logo

标题: [文本处理] 【已解决】求助批处理从一个XML中提取需要的内容写到csv中 [打印本页]

作者: zhengwei007    时间: 7 小时前     标题: 【已解决】求助批处理从一个XML中提取需要的内容写到csv中

本帖最后由 zhengwei007 于 2024-11-23 17:14 编辑

就只有一个文件,但里面内容太多,手动不太现实,我截取一段代码:
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ExtractableItems.xsd">
  3. <item id="7629"> <!-- Looted Goods - White Cargo box -->
  4. <extract id="6688" quantity="1" chance="9" /> <!-- Forgotten Blade Edge -->
  5. <extract id="6689" quantity="1" chance="9" /> <!-- Basalt Battlehammer Head -->
  6. <extract id="6690" quantity="1" chance="9" /> <!-- Imperial Staff Head -->
  7. <extract id="6691" quantity="1" chance="9" /> <!-- Angel Slayer Blade -->
  8. <extract id="6693" quantity="1" chance="9" /> <!-- Dragon Hunter Axe Blade -->
  9. <extract id="6694" quantity="1" chance="9" /> <!-- Saint Spear Blade -->
  10. <extract id="6695" quantity="1" chance="9" /> <!-- Demon Splinter Blade -->
  11. <extract id="6696" quantity="1" chance="9" /> <!-- Heavens Divider Edge -->
  12. <extract id="6697" quantity="1" chance="9" /> <!-- Arcana Mace Head -->
  13. <extract id="7579" quantity="1" chance="9" /> <!-- Draconic Bow Shaft -->
  14. <extract id="57" quantity="330000" chance="10" /> <!-- Adena -->
  15. </item>
  16. <item id="7631"> <!-- Looted Goods - Yellow Cargo box -->
  17. <extract id="6701" quantity="1" chance="20" /> <!-- Sealed Imperial Crusader Breastplate Part -->
  18. <extract id="6702" quantity="1" chance="20" /> <!-- Sealed Imperial Crusader Gaiters Pattern -->
  19. <extract id="6707" quantity="1" chance="20" /> <!-- Sealed Draconic Leather Armor Part -->
  20. <extract id="6711" quantity="1" chance="20" /> <!-- Sealed Major Arcana Robe Part -->
  21. <extract id="57" quantity="930000" chance="20" /> <!-- Adena -->
  22. </item>
  23. <item id="6505"> <!-- Orange Treasure Chest -->
  24. <extract id="6910" quantity="3" chance="58" /> <!-- Premium Fish Oil -->
  25. <extract id="-1" quantity="0" chance="42" /> <!-- Nothing -->
  26. </item>
  27. </list>
复制代码
以上代码通过批处理,希望得到以下内容,主要提取itemID,extractID,quantity,chance,结果如下:
  1. item id,extract id,quantity, chance
  2. 7629,6688,1,9
  3. 7629,6689,1,9
  4. 7629,6690,1,9
  5. 7629,6691,1,9
  6. 7629,6693,1,9
  7. 7629,6694,1,9
  8. 7629,6695,1,9
  9. 7629,6696,1,9
  10. 7629,6697,1,9
  11. 7629,7579,1,9
  12. 7629,57,330000,10
  13. 7631,6701,1,20
  14. 7631,6702,1,20
  15. 7631,6707,1,20
  16. 7631,6711,1,20
  17. 7631,57,930000,20
  18. 6505,6910,3,58
  19. 6505,-1,0,42
复制代码
以上是最终结果,就是把itemid排一下,有几个extract id,就填充几个item id。
注:最后一行的-1可以不要,麻烦我自己筛选删除也行。
作者: wanghan519    时间: 6 小时前

保存成bat,大概可以
  1. #ANSI&cls&powershell -NoProfile -NoLogo "gc '%~0'|out-string|iex"&pause&exit
  2. $x = [xml](gc a.xml)
  3. $x.SelectNodes("//item") | %{
  4.     $id = $_.id
  5.     $_.SelectNodes("./extract") | %{
  6.         ($id, $_.id, $_.quantity, $_.chance) -join ","
  7.     }
  8. } | Out-File -Encoding oem a.csv
复制代码

作者: aloha20200628    时间: 4 小时前

回复 1# zhengwei007

批处版本...
  1. @echo off &setlocal enabledelayedexpansion
  2. (echo,item id,extract id,quantity,chance
  3. for /f "tokens=1-7 delims= <>= " %%a in (
  4.    'findstr /i /c:"item id=" /c:"extract id=" 0.xml'
  5. ) do if /i "%%a"=="item" (set "h=%%~c") else (set/p="!h!,%%~c,%%~e,"<nul&echo,%%~g))>out.csv
  6. endlocal&pause&exit/b
复制代码

作者: zhengwei007    时间: 4 小时前

感谢两位,都能使用,小1万行瞬间完成。
作者: aloha20200628    时间: 4 小时前

本帖最后由 aloha20200628 于 2024-11-23 17:20 编辑


vbs/jscript/powershell 内置的 xml 解析接口为析取网页数据提供了 ‘直通车’,但要求网页源文件的格式须严格符合 xml 规范,否则容易卡壳退出...





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