[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 22# qixiaobin0715

谢谢!搜索了下,屏幕和文件同时显示,需要使用type out.txt

TOP

echo显示内容时,后面加“空格或,或;或.或/.......”均可。
20楼代码已修改

TOP

回复 20# qixiaobin0715

谢谢热心回复!
请问echo,!str!   echo后面的“,”有什么作用,好像去掉也可以的。

你的代码cad窗口输出了结果 ,如果同时输出out.txt文件呢?

循环最外面加了)>out.txt,cmd窗口又不输出了。

TOP

本帖最后由 qixiaobin0715 于 2024-4-16 17:13 编辑
  1. @echo off
  2. (for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.     setlocal enabledelayedexpansion
  4.     for /f "tokens=1-3,5,11" %%a in ('type "%%i"') do (
  5.         set /a n+=1
  6.         if !n! equ 4 (
  7.             set str=%%a
  8.         ) else if "%%a %%b %%c"=="excluding mass coefficients" (
  9.             set m=0
  10.         ) else if defined m (
  11.             set /a m+=1
  12.             set str=!str! %%d %%e
  13.             if !m! equ 2 (
  14.                 echo,!str!
  15.                 set m=
  16.             )
  17.         )
  18.     )
  19.     endlocal
  20. ))>out.txt
  21. pause
复制代码
1

评分人数

TOP

回复 18# terse

谢谢!

TOP

回复 12# meiszp
不通用,仅针对样本写的
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2*delims=:" %%i in ('"findstr /n . *.txt|findstr /c:"txt:5:" /c:"excluding mass coefficients""') do (
  3.      if defined _%%i (set $%%i=%%j) else for /f %%k in ("%%k") do set "_%%i=%%~xnk"
  4. )
  5. (
  6.      for /f "tokens=1,2,4,6*delims=:=[" %%a in ('findstr /inrc:"\<MAIN .*\[NS*/M\]$"  *.txt') do (
  7.           if %%b gtr !$%%a! (
  8.               if !num! == !_%%a! (
  9.                   if defined str (set str=!str! %%c %%d)else set str=!num! %%c %%d
  10.               ) else echo;!str: =!&set num=!_%%a!&set str=!num! %%c %%d
  11.           ) else if not defined num set num=!_%%a!
  12.      )
  13.      echo;!str: =!
  14. )>out.log
  15. pause
复制代码
1

评分人数

TOP

回复 14# aloha20200628

谢谢,试验成功。开始输出不对,后来发现是 dir /b/s/a-d还输出了子目录下的txt文件,改成 dir /b/a-d就自输出当前目录。

TOP

回复 15# 77七
两个代码删除第二行 chcp 65001 >nul ,运行成功。
由于代码帅选规则,txt文件必须和试样文件相同。

TOP

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
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 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
复制代码

TOP

回复 11# aloha20200628
完美,谢谢大佬!
如果还愿意的话可以再修改下代码

第1列不是文件名101而是文件里第5行的内容,代码该怎么写?
固定是第5行,可以打开txt看,第5行其实就是文件名。

TOP

回复 10# terse
是的,包含一行空白,是第5行,可以打开文件看看,第5行其实就是文件名称。

TOP

本帖最后由 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
复制代码

TOP

回复 6# meiszp
是固定的第五行吗

TOP

返回列表