批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[文本处理] 求BAT代码批量取文件里的字段值保存到txt

大佬们新年好!求一个bat
源文件下面有多个文件夹,每个文件里面有多个文件(可能有多层路径的情况),每个文件格式不一定,但都可以用记事本方式打开。
我的目的是要取每个文件里面的几个字段的值,取出来后保存到一个txt文件中。
字段是这样的,Code="X" Name="XX" Tender="XXX",我要取的就是Code=""、Name=""、Tender="",三个字段,每个字段两个引号里面的值。但这几个字段不一定每个文件都会有,字段的顺序前后不一定,出现在文件的哪个位置也不一定。
保存到txt里有这样的要求:文件完整路径+文件名+Code值+Name值+Tender值,每个文件取出来的数据放一行,下一个文件的数据放下一行,以此类推。
示例文件放在了网盘:链接:https://pan.baidu.com/s/10AZXPUdMyn3EO6H9wjspNw 提取码:2alj
感谢大佬!

  1. # 保存了ANSI编码
  2. /Code="([^"]+)"/ {A = gensub(/^.*Code="([^"]+)".*$/, "\\1", "g", $0)}
  3. /Name="([^"]+)"/ {B = gensub(/^.*Name="([^"]+)".*$/, "\\1", "g", $0)}
  4. /Tender="([^"]+)"/ {C = gensub(/^.*Tender="([^"]+)".*$/, "\\1", "g", $0)}
  5. END {print FILENAME "+" A "+" B "+" C}
复制代码
以ANSI编码格式保存为test.awk
  1. @echo off
  2. @rem 保存为ANSI格式
  3. set "_gawk.exe=1"
  4. set "_test.awk=1"
  5. set "_test.bat=1"
  6. set "_test.txt=1"
  7. (for /f "tokens=*" %%a in ('dir/s/b/a-d') do (
  8. if not defined _%%~nxa gawk -f.\test.awk "%%~fa"
  9. ))>test.txt
复制代码
以ANSI编码格式保存为test.bat
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )后,将gawk.exe、test.awk及test.bat放置到"D:\实例"文件夹中,双击test.bat后得到的test.txt即为你需要的结果

TOP

回复 2# hfxiang


    大佬,感谢回复!但好像双击bat后一闪而过,没有txt产生

TOP

回复 3# 304802301


    请确保
1、test.awk 及 test.bat以已 ANSI 编码格式保存
2、gawk.exe、test.awk 及 test.bat 已放置到 "D:\ 实例" 文件夹中

TOP

  1. @echo off
  2. for /f "delims=" %%a in ('dir /s /b /a-d^|findstr /v %~nx0') do (
  3.     setlocal enabledelayedexpansion
  4.     for /f "delims=" %%b in ('findstr "Code Name Tender" "%%a"') do (
  5.         for %%i in (%%b) do (
  6.             if "!str!"=="Code" (
  7.                 set Code=%%~i
  8.             ) else if "!str!"=="Name" (
  9.                 set Name=%%~i
  10.             ) else if "!str!"=="Tender" (
  11.                 set Tender=%%~i
  12.             )
  13.             set str=%%~i
  14.         )
  15.     )
  16.     if defined Code echo,%%a !Code! !Name! !Tender!
  17.     endlocal
  18. )
  19. pause
复制代码

TOP

楼上代码可以简化一下:
  1. @echo off
  2. set /a _Code=_Name=_Tender=1
  3. for /f "delims=" %%a in ('dir /s /b /a-d^|findstr /v %~nx0') do (
  4.     setlocal enabledelayedexpansion
  5.     for /f "delims=" %%b in ('findstr "Code Name Tender" "%%a"') do (
  6.         for %%i in (%%b) do (
  7.             if defined _!str! set !str!=%%~i
  8.             set str=%%~i
  9.         )
  10.     )
  11.     if defined Code echo,%%a !Code! !Name! !Tender!
  12.     endlocal
  13. )
  14. pause
复制代码

TOP

返回列表