标题: [文本处理] 【已解决】求批量提取文件内容BAT代码? [打印本页]
作者: meiszp 时间: 2024-4-13 16:34 标题: 【已解决】求批量提取文件内容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
作者: terse 时间: 2024-4-13 18:03
- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%f in ('dir /b /a-d *.txt') do (
- set "exc="
- for /f "usebackq tokens=*" %%i in ("%%f") do (
- if defined exc (
- for /f "tokens=2,3delims==" %%a in ("%%i") do (
- if "%%b" neq "" (
- for %%A in ("%%a" "%%b") do (
- for /f %%c in (%%A) do set "exc=!exc! %%c"
- )
- ) else (
- echo !exc!
- set "exc="
- )
- )
- )
- if /i "%%~xni" == "excluding mass coefficients" (set exc=%%~nf)
- )
- ))>out.txt 2>nul
- pause
复制代码
作者: 77七 时间: 2024-4-13 18:43
- @echo off
- chcp 65001 >nul
- cd /d "%~dp0"
- (for /f "delims=" %%x in ('dir /b /a-d *.txt ^|find /v "out.txt"') do (
- for /f "useback tokens=1-12" %%a in ("%%x") do (
- if /i "%%a%%b%%c" equ "excludingmasscoefficients" (
- set m=1
- ) else if defined m (
- if /i "%%a%%b%%c" equ "MAINST.K" (
- set /p="%%~nx %%e %%k"<nul
- ) else if /i "%%a%%b%%c" equ "MAIND.C" (
- echo= %%e %%k
- set m=
- )
- )
- )
- ))>"out.txt"
- pause
复制代码
作者: aloha20200628 时间: 2024-4-13 21:23
本帖最后由 aloha20200628 于 2024-4-13 21:27 编辑
回复 1# meiszp
输出结果文件为 out.txt.new,与被处理文件*.txt同目录
用楼主提供的4个示例文件测试通过...- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%F in ('dir /b/s/a-d *.txt') do (
- set "v=%%~nF"
- for /f "tokens=1-4 delims==[" %%1 in ('findstr /ic:"MAIN ST. K =" /ic:"MAIN D. C =" "%%F"^|more +2') do (
- set "v=!v! %%2 %%4"
- )
- echo,!v: =!
- ))>out.txt.new
复制代码
作者: hfxiang 时间: 2024-4-14 10:04
回复 1# meiszp
用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )的解决办法如下:- 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
复制代码
作者: meiszp 时间: 2024-4-15 10:55
回复 2# terse
谢谢大佬帮助。如果第1列不是文件名101而是文件里第5行的101,代码该怎么写?
作者: meiszp 时间: 2024-4-15 10:56
本帖最后由 meiszp 于 2024-4-15 11:04 编辑
回复 3# 77七
谢谢热心帮助,运行代码显示" press any key to continue…",out.txt为空。
作者: meiszp 时间: 2024-4-15 11:03
本帖最后由 meiszp 于 2024-4-15 11:05 编辑
回复 4# aloha20200628
谢谢热心帮助,试验了下代码。如果文件夹下全是试验的txt文件,运行成功。
但如果有其他的txt文件,就会输出文件名。
作者: meiszp 时间: 2024-4-15 11:04
回复 5# hfxiang
谢谢热心帮助。
作者: terse 时间: 2024-4-15 11:10
回复 6# meiszp
是固定的第五行吗
作者: aloha20200628 时间: 2024-4-15 11:13
本帖最后由 aloha20200628 于 2024-4-15 11:14 编辑
回复 8# meiszp
代码订正如下- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%F in ('dir /b/s/a-d *.txt') do (
- set "v=%%~nF"
- for /f "tokens=1-4 delims==[" %%1 in ('findstr /ic:"MAIN ST. K =" /ic:"MAIN D. C =" "%%F"^|more +2') do (
- set "v=!v! %%2 %%4"
- )
- if "!v!" neq "%%~nF" echo,!v: =!
- ))>out.txt.new
复制代码
作者: meiszp 时间: 2024-4-15 11:18
回复 10# terse
是的,包含一行空白,是第5行,可以打开文件看看,第5行其实就是文件名称。
作者: meiszp 时间: 2024-4-15 11:24
回复 11# aloha20200628
完美,谢谢大佬!
如果还愿意的话可以再修改下代码
第1列不是文件名101而是文件里第5行的内容,代码该怎么写?
固定是第5行,可以打开txt看,第5行其实就是文件名。
作者: aloha20200628 时间: 2024-4-15 12:15
本帖最后由 aloha20200628 于 2024-4-15 12:18 编辑
回复 13# meiszp
读取第5行还须删除前后空白字符...订正代码如下- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%F in ('dir /b/s/a-d *.txt') do (
- (call :get5 "%%F" v5) &set "v=!v5!"
- for /f "tokens=1-4 delims==[" %%1 in ('findstr /ic:"MAIN ST. K =" /ic:"MAIN D. C =" "%%F"^|more +2') do (
- set "v=!v! %%2 %%4"
- )
- if "!v!" neq "!v5!" echo,!v: =!
- ))>out.txt.new
- exit/b
- :get5
- for /f "usebackq skip=4 tokens=1 delims= " %%s in ("%~1") do (set "%~2=%%s"&exit/b)
- exit/b
复制代码
作者: 77七 时间: 2024-4-15 13:06
3楼代码使用楼主提供的文件,我这里测试结果正确。
根据楼主最新需求,以目标固定在文本第5 294 296行为规律,再写一个。- @echo off
- chcp 65001 >nul
- cd /d "%~dp0"
- (for /f "delims=" %%x in ('dir /b /s /a-d *.txt') do (
- if "%%~nxx" neq "out.txt" (
- for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%x" ^|findstr /rb "\[5\] \[294\] \[296\]"') do (
- if not defined str (
- call :1 %%b
- ) else (
- call :2 "%%b"
- )
- )
- call echo %%str%%
- set str=
- )
- ))>out.txt
- pause & exit
-
- :1
- set str=%*
- exit /b
- :2
- for %%c in (%~1) do (
- if "%%~xc" neq "" (
- call set str=%%str%% %%~nxc
- )
- )
- exit /b
复制代码
作者: meiszp 时间: 2024-4-15 15:13
回复 15# 77七
两个代码删除第二行 chcp 65001 >nul ,运行成功。
由于代码帅选规则,txt文件必须和试样文件相同。
作者: meiszp 时间: 2024-4-15 15:30
回复 14# aloha20200628
谢谢,试验成功。开始输出不对,后来发现是 dir /b/s/a-d还输出了子目录下的txt文件,改成 dir /b/a-d就自输出当前目录。
作者: terse 时间: 2024-4-15 19:39
回复 12# meiszp
不通用,仅针对样本写的- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2*delims=:" %%i in ('"findstr /n . *.txt|findstr /c:"txt:5:" /c:"excluding mass coefficients""') do (
- if defined _%%i (set $%%i=%%j) else for /f %%k in ("%%k") do set "_%%i=%%~xnk"
- )
- (
- for /f "tokens=1,2,4,6*delims=:=[" %%a in ('findstr /inrc:"\<MAIN .*\[NS*/M\]$" *.txt') do (
- if %%b gtr !$%%a! (
- if !num! == !_%%a! (
- if defined str (set str=!str! %%c %%d)else set str=!num! %%c %%d
- ) else echo;!str: =!&set num=!_%%a!&set str=!num! %%c %%d
- ) else if not defined num set num=!_%%a!
- )
- echo;!str: =!
- )>out.log
- pause
复制代码
作者: meiszp 时间: 2024-4-16 09:20
回复 18# terse
谢谢!
作者: qixiaobin0715 时间: 2024-4-16 09:54
本帖最后由 qixiaobin0715 于 2024-4-16 17:13 编辑
- @echo off
- (for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- setlocal enabledelayedexpansion
- for /f "tokens=1-3,5,11" %%a in ('type "%%i"') do (
- set /a n+=1
- if !n! equ 4 (
- set str=%%a
- ) else if "%%a %%b %%c"=="excluding mass coefficients" (
- set m=0
- ) else if defined m (
- set /a m+=1
- set str=!str! %%d %%e
- if !m! equ 2 (
- echo,!str!
- set m=
- )
- )
- )
- endlocal
- ))>out.txt
- pause
复制代码
作者: meiszp 时间: 2024-4-16 16:51
回复 20# qixiaobin0715
谢谢热心回复!
请问echo,!str! echo后面的“,”有什么作用,好像去掉也可以的。
你的代码cad窗口输出了结果 ,如果同时输出out.txt文件呢?
循环最外面加了)>out.txt,cmd窗口又不输出了。
作者: qixiaobin0715 时间: 2024-4-16 17:13
echo显示内容时,后面加“空格或,或;或.或/.......”均可。
20楼代码已修改
作者: meiszp 时间: 2024-4-16 17:18
回复 22# qixiaobin0715
谢谢!搜索了下,屏幕和文件同时显示,需要使用type out.txt
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |