Board logo

标题: [文本处理] BAT脚本批量提取文本中的内容? [打印本页]

作者: 宝宝抱抱贝贝    时间: 2023-6-16 20:34     标题: BAT脚本批量提取文本中的内容?

大佬,帮一下小萌新,实在折腾不出来了!
想逐行读取文本内容,获取DzAPI_Map_HasMallItem关键字后面引号中的四位字母,输出到新文本,最好可以去重。

例:有一个txt内容如下:
if DzAPI_Map_HasMallItem(Player(0),"ZABC")==true or
DzAPI_Map_HasMallItem(Player(0),"QWER")==true or DzAPI_Map_HasMallItem(Player(0),"WEIY")==true then
DzAPI_Map_HasMallItem(Player(0),"WEIY")
输出:
ZABC
QWER
WEIY
作者: 77七    时间: 2023-6-16 21:27

本帖最后由 77七 于 2023-6-16 21:38 编辑
  1. @echo off
  2. (for /f tokens^=2^,4delims^=^" %%a in ('type "1.txt" ^|find "DzAPI_Map_HasMallItem"') do (
  3. if not defined _"%%a" (
  4. echo %%a
  5. set _"%%a"=1
  6. )
  7. if "%%b" neq "" if not defined _"%%b" (
  8. echo %%b
  9. set _"%%b"=1
  10. )
  11. ))>2.txt
复制代码

作者: jyswjjgdwtdtj    时间: 2023-6-16 21:30

本帖最后由 jyswjjgdwtdtj 于 2023-6-16 21:32 编辑

保存为vbs 如果获取不到 就把我标记了这里!的0换成-1或-2 总有一个是对的
  1. set fso=createobject("scripting.filesystemobject")
  2. set f=fso.opentextfile("1.txt",1,false,0)'这里!
  3. a=f.readall
  4. set f=fso.createtextfile("2.txt",true)
  5. set re=new regexp
  6. re.global=true
  7. re.pattern="DzAPI_Map_HasMallItem\(.*?,""(.*?)""\)"
  8. for each i in re.execute(a)
  9. f.writeline i.submatches(0)
  10. next
复制代码

作者: pd1    时间: 2023-6-16 21:38

  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a=get-content 1.txt
  7. $regex = [regex]"`"([A-Z]{4})`""
  8. $regex.Matches($a)|%{$_.Groups[1].Value}|Select-Object -Unique|Out-File -Append -FilePath 2.txt
复制代码

作者: qixiaobin0715    时间: 2023-6-17 09:10

本帖最后由 qixiaobin0715 于 2023-6-17 12:04 编辑

如果像你例子中那样,没有其它干扰项:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "str=%%i"
  5.     set "str=!str:(= !"
  6.     set "str=!str:)= !"
  7.     for %%j in (!str!) do (
  8.         if "%%j"=="DzAPI_Map_HasMallItem" (
  9.             set n=0
  10.         ) else if defined n (
  11.             set /a n+=1
  12.             if !n! equ 3 (
  13.                 set n=
  14.                 if not defined _%%~j (
  15.                     echo,%%~j
  16.                     set _%%~j=true
  17.                 )
  18.             )
  19.         )
  20.     )
  21. ))>2.txt
  22. pause
复制代码
否则最好把你真实文本通过网盘传上来,让大家看看。
作者: hfxiang    时间: 2023-6-17 09:31

本帖最后由 hfxiang 于 2023-6-17 10:09 编辑

回复 1# 宝宝抱抱贝贝

如果不介意第3方工具,可用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),指令如下:
  1. gawk -F"=+" "/DzAPI_Map_HasMallItem/{for(i=1;i<=NF;i++)if(match($i,/^.*DzAPI_Map_HasMallItem\([^\(]+\([^\(]+\),\"(....)\"\).*$/,arr))if(!x[arr[1]]++)print arr[1]}" 1.txt>2.txt
复制代码

作者: 宝宝抱抱贝贝    时间: 2023-6-17 10:50

回复 5# qixiaobin0715

好的大佬
链接: https://pan.baidu.com/s/1LguIDIUVuCRiVLa98yF7zg?pwd=i3i3 提取码: i3i3 复制这段内容后打开百度网盘手机App,操作更方便哦
作者: 宝宝抱抱贝贝    时间: 2023-6-17 10:55

回复 6# hfxiang


    下载了 但是打不开,管理员运行也不行。。。
作者: 宝宝抱抱贝贝    时间: 2023-6-17 10:59

回复 2# 77七


    感谢大佬 好使 我研究下 学习学习
作者: hfxiang    时间: 2023-6-17 11:10

回复 7# 宝宝抱抱贝贝
  1. gawk -F"=+" "/DzAPI_Map_HasMallItem\(/{for(i=1;i<=NF;i++)if(match($i,/^.*DzAPI_Map_HasMallItem\([^\042]+\"(.+)\"\).*$/,arr))if(!x[arr[1]]++)print arr[1]}" war3map.j>out.txt
复制代码

作者: hfxiang    时间: 2023-6-17 11:12

回复 8# 宝宝抱抱贝贝

下载后把gawk.exe复制到 “C:\Windows\System32\”




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