[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 4# zhengwei007
想法太美好,现实很骨感。哪里又有通用代码,况且你要处理的文件又不是很规范。

TOP

回复 11# zhengwei007

用7楼代码随机测试了11楼提供的几个文件(代码中的 1.xml 改为测试文件名),均予通过...
以下代码是将7楼代码改为批量处理版本,可将当前目录下的全部 *.xml 中的目标字段值析取整合到 new.xml,测试结果共析取9208条数据,与源文件名区间号码一致...
  1. @echo off &setlocal enabledelayedexpansion &echo,稍候...
  2. set "lst=,item id, type, name,icon,bodypart,armor_type,weight,soulshots,spiritshots,crystal_type,p_dam,rnd_dam,weapon_type,critical,hit_modify,atk_speed,m_dam,price,sellable,dropable,tradeable,pAtk,mAtk,rCrit,accCombat,pAtkSpd,pAtk1,mAtk1,pDef,"
  3. set "v=!lst!"
  4. (echo,item,type,name,icon,bodypart,armor_type,weight,soulshots,spiritshots,crystal_type,p_dam,rnd_dam,weapon_type,critical,hit_modify,atk_speed,m_dam,price,sellable,dropable,tradeable,pAtk,mAtk,rCrit,accCombat,pAtkSpd,pAtk1,mAtk1,pDef
  5. for /f "delims=" %%F in ('dir/b/a-d *.xml') do for /f tokens^=1-7^delims^=^ ^<^=^" %%a in (
  6.    'findstr /rbi /c:" *.*=\"^" /c:" ^</item^>" "%%F" ') do (
  7.    if /i "%%a"=="item id" (
  8.        set "v=!v:%%a,=%%b,!"&set "v=!v:%%c,=%%d,!"&set "v=!v:%%e,=%%f,!"
  9.    ) else if "%%e"==" />" (set "v=!v:%%b,=%%d,!"
  10.    ) else if "%%g"==" />" (
  11.        set "go=1"&for %%s in ("%%f","%%f1") do if defined go if "!v:%%~s,=%%b,!" neq "!v!" (
  12.        set "go="&set "v=!v:%%~s,=%%b,!")
  13.    ) else if /i "%%a"=="/item>" ((for %%s in (!lst!) do set "v=!v:,%%s,=,,!")&echo,!v:~1,-1!&set "v=!lst!")
  14. ))>"new.xml"
  15. endlocal&pause&exit/b
复制代码
1

评分人数

TOP

谢谢各位大佬,已经解决了,我发现修改后和别的内容根本不能通用,我是想的有点多了,再次感谢。

TOP

本帖最后由 qixiaobin0715 于 2024-11-22 16:01 编辑

所谓通用可以说基本上是不存在的,下面代码只是兼容性要好一些。如果你能够看得懂,处理与1楼结构基本相似的文本,经过适当修改可能会行得通。文本中如果存在*?等这样的字符可能会影响处理结果:
  1. @echo off
  2. set "TableHeader=id,type,name,icon,bodypart,armor_type,weight,soulshots,spiritshots,crystal_type,p_dam,rnd_dam,weapon_type,critical,hit_modify,atk_speed,m_dam,price,sellable,dropable,tradeable,pAtk,mAtk,rCrit,accCombat,pAtkSpd,pAtk,mAtk,pDef"
  3. for %%i in (%TableHeader%) do set "_%%i=true"
  4. (echo,%TableHeader%
  5. setlocal enabledelayedexpansion
  6. for /f "tokens=2 delims=<>" %%i in ('type *.xml 2^>nul^|findstr "<item </item> <set <add"') do (
  7.     set ns=
  8.     set v=
  9.     if not "%%i"=="/item" (
  10.         for %%k in (%%i) do (
  11.             if defined _!str! (
  12.                 if defined !str! (
  13.                     set "ns=%%~k"
  14.                 ) else (
  15.                     set "!str!=%%k"
  16.                 )
  17.             ) else (
  18.                 if defined _%%~k (
  19.                     set "ns=%%~k"
  20.                 ) else if "!str!"=="val" (
  21.                     set "v=%%k"
  22.                 )
  23.             )
  24.             set "str=%%k"
  25.         )
  26.         if defined ns (
  27.             if defined v set "!ns!=!v!"
  28.         )
  29.     ) else (
  30.         for %%k in (%TableHeader%) do (
  31.             if defined line (set "line=!line!,!%%k!") else set "line=!%%k!"
  32.             set %%k=
  33.         )
  34.         echo,!line!
  35.         set line=
  36.     )
  37. ))>1.csv
  38. pause
复制代码
1

评分人数

TOP

回复 18# zhengwei007

其实本帖类似一个 '快递' 游戏 链表变量 lst 类似一排 '收货人',源文件每行类似一串 '发货点',代码逐行处理,'取货传至收货人',因此先用 findstr 要一网打尽所有 '收货点',不能遗漏,再逐行处理去准确寻址 '发货点',最后还要确保链表中的 '收货人' 与 '发货点' 一一对应,传收无误。由此可见,链表中的数据项与源文件中目标行对应的属性名及位置关系要有一定规律,不能错乱,只要不乱,这个 '游戏' 就可以玩下去,数据项不怕多,当然链表最大长度是8K字符量...如此而已

TOP

谢谢楼上的大佬们。

TOP

返回列表