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

[文本处理] 【已解决】求批量提取文件内容BAT代码?

[复制链接]
发表于 2024-4-13 16:34:35 | 显示全部楼层 |阅读模式
本帖最后由 meiszp 于 2024-4-29 11:37 编辑

文件夹下有多个.txt文件,名字随意
101.txt
102.txt
201.txt
202.txt
……


逐个打txt文件,在下面位置提取数据
excluding mass coefficients

  MAIN ST. K = 0.134791E+06 [N/M]     X-C. ST. k = 0.485545E+05 [N/M]

  MAIN D.  C = 0.589759E+02 [NS/M]     X-C. D.  c = -.131594E+02 [NS/M]
  
*********************************************************************************

提取上面行中的红字数据写入out.txt
第1列文件名,第2~5列为图片中提取的数据,按1、2、3、4顺序写入

101        0.134791E+06        0.485545E+05        0.589759E+02        -.131594E+02
102        0.465204E+05        -.281788E+05        0.486467E+02        0.489242E+02
201        0.231737E+06        0.802880E+05        0.105552E+03        -.192042E+02
202        0.667682E+05        -.435220E+05        0.695443E+02        0.780624E+02
附件上传不了,试验用的文件
https://pan.baidu.com/s/1WWO7qBNrUT_zOM1chJ-1WQ?pwd=1nny

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-4-13 18:03:52 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%f in ('dir /b /a-d *.txt') do (
  3.      set "exc="
  4.      for /f "usebackq tokens=*" %%i in ("%%f") do (
  5.           if defined exc (
  6.                for /f "tokens=2,3delims==" %%a in ("%%i") do (
  7.                     if "%%b" neq "" (
  8.                          for %%A in ("%%a" "%%b") do (
  9.                               for /f %%c in (%%A) do set "exc=!exc!        %%c"
  10.                          )
  11.                     ) else (
  12.                          echo !exc!
  13.                          set "exc="
  14.                     )
  15.                )
  16.           )
  17.           if /i "%%~xni" == "excluding mass coefficients" (set exc=%%~nf)
  18.      )
  19. ))>out.txt 2>nul
  20. pause
复制代码
发表于 2024-4-13 18:43:41 | 显示全部楼层
  1. @echo off
  2. chcp 65001 >nul
  3. cd /d "%~dp0"
  4. (for /f "delims=" %%x in ('dir /b /a-d *.txt ^|find /v "out.txt"') do (
  5.         for /f "useback tokens=1-12" %%a in ("%%x") do (
  6.                 if /i "%%a%%b%%c" equ "excludingmasscoefficients" (
  7.                         set m=1
  8.                 ) else if defined m (
  9.                         if /i "%%a%%b%%c" equ "MAINST.K" (
  10.                                 set /p="%%~nx        %%e        %%k"<nul
  11.                         ) else if /i "%%a%%b%%c" equ "MAIND.C" (
  12.                                 echo=        %%e        %%k
  13.                                 set m=
  14.                         )
  15.                 )
  16.         )
  17. ))>"out.txt"
  18. pause
复制代码
发表于 2024-4-13 21:23:39 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-4-13 21:27 编辑

回复 1# meiszp

输出结果文件为 out.txt.new,与被处理文件*.txt同目录
用楼主提供的4个示例文件测试通过...

  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%F in ('dir /b/s/a-d *.txt') do (
  3.         set "v=%%~nF"
  4.         for /f "tokens=1-4 delims==[" %%1 in ('findstr /ic:"MAIN ST. K =" /ic:"MAIN D.  C =" "%%F"^|more +2') do (
  5.                 set "v=!v!        %%2        %%4"
  6.         )
  7.         echo,!v: =!
  8. ))>out.txt.new
复制代码
发表于 2024-4-14 10:04:36 | 显示全部楼层
回复 1# meiszp
用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )的解决办法如下:

  1. gawk -v"OFS=\t" "/excluding mass coefficients/,/\*{60,}/{if(/MAIN/){A[++i]=$5;A[++i]=$11}if(/\*{60,}/)print substr(FILENAME,1,length(FILENAME)-4),A[1],A[2],A[3],A[4];next}{i=0}" *.txt>out.txt
复制代码
 楼主| 发表于 2024-4-15 10:55:02 | 显示全部楼层
回复 2# terse
谢谢大佬帮助。如果第1列不是文件名101而是文件里第5行的101,代码该怎么写?
 楼主| 发表于 2024-4-15 10:56:47 | 显示全部楼层
本帖最后由 meiszp 于 2024-4-15 11:04 编辑

回复 3# 77七
谢谢热心帮助,运行代码显示" press any key to continue…",out.txt为空。
 楼主| 发表于 2024-4-15 11:03:37 | 显示全部楼层
本帖最后由 meiszp 于 2024-4-15 11:05 编辑

回复 4# aloha20200628
谢谢热心帮助,试验了下代码。如果文件夹下全是试验的txt文件,运行成功。
但如果有其他的txt文件,就会输出文件名。
 楼主| 发表于 2024-4-15 11:04:15 | 显示全部楼层
回复 5# hfxiang
谢谢热心帮助。
发表于 2024-4-15 11:10:12 | 显示全部楼层
回复 6# meiszp
是固定的第五行吗
发表于 2024-4-15 11:13:18 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-4-15 11:14 编辑

回复 8# meiszp

代码订正如下

  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%F in ('dir /b/s/a-d *.txt') do (
  3.         set "v=%%~nF"
  4.         for /f "tokens=1-4 delims==[" %%1 in ('findstr /ic:"MAIN ST. K =" /ic:"MAIN D.  C =" "%%F"^|more +2') do (
  5.                 set "v=!v!        %%2        %%4"
  6.         )
  7.         if "!v!" neq "%%~nF" echo,!v: =!
  8. ))>out.txt.new
复制代码
 楼主| 发表于 2024-4-15 11:18:47 | 显示全部楼层
回复 10# terse
是的,包含一行空白,是第5行,可以打开文件看看,第5行其实就是文件名称。
 楼主| 发表于 2024-4-15 11:24:06 | 显示全部楼层
回复 11# aloha20200628
完美,谢谢大佬!
如果还愿意的话可以再修改下代码

第1列不是文件名101而是文件里第5行的内容,代码该怎么写?
固定是第5行,可以打开txt看,第5行其实就是文件名。
发表于 2024-4-15 12:15:27 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-4-15 12:18 编辑

回复 13# meiszp

读取第5行还须删除前后空白字符...订正代码如下

  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%F in ('dir /b/s/a-d *.txt') do (
  3.         (call :get5 "%%F" v5) &set "v=!v5!"
  4.         for /f "tokens=1-4 delims==[" %%1 in ('findstr /ic:"MAIN ST. K =" /ic:"MAIN D.  C =" "%%F"^|more +2') do (
  5.                 set "v=!v!        %%2        %%4"
  6.         )
  7.         if "!v!" neq "!v5!" echo,!v: =!
  8. ))>out.txt.new
  9. exit/b
  10. :get5
  11.    for /f "usebackq skip=4 tokens=1 delims=         " %%s in ("%~1") do (set "%~2=%%s"&exit/b)
  12.    exit/b
复制代码
发表于 2024-4-15 13:06:12 | 显示全部楼层
3楼代码使用楼主提供的文件,我这里测试结果正确。
根据楼主最新需求,以目标固定在文本第5 294 296行为规律,再写一个。
  1. @echo off
  2. chcp 65001 >nul
  3. cd /d "%~dp0"
  4. (for /f "delims=" %%x in ('dir /b /s /a-d *.txt') do (
  5.         if "%%~nxx" neq "out.txt" (
  6.                 for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%x" ^|findstr /rb "\[5\] \[294\] \[296\]"') do (
  7.                         if not defined str (
  8.                                 call :1 %%b
  9.                         ) else (
  10.                                 call :2 "%%b"
  11.                         )
  12.                 )
  13.                 call echo %%str%%
  14.                 set str=
  15.         )
  16. ))>out.txt
  17. pause & exit

  18.         :1
  19.         set str=%*
  20.         exit /b
  21.         :2
  22.         for %%c in (%~1) do (
  23.                 if "%%~xc" neq "" (
  24.                         call set str=%%str%%        %%~nxc
  25.                 )
  26.         )
  27.         exit /b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 02:48 , Processed in 0.022382 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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