Board logo

标题: [文本处理] 【已解决】批处理如何提取文件内容重命名原文件? [打印本页]

作者: meiszp    时间: 2024-4-22 09:42     标题: 【已解决】批处理如何提取文件内容重命名原文件?

本帖最后由 meiszp 于 2024-4-29 11:36 编辑

提取目录下1-1.txt文件第4行(不包含空白行)的字符串101,将1-1.txt命名为101.txt

1-1.txt前几行数据如下:

BLOWER Co.                                                            
  
***********************************************************************
    ANALABC OF  SEALS      
    101                                                                                                                                    
***********************************************************************
  
  ***********************************************
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a count=0
  4. for /f "tokens=1 delims= " %%i in (1-1.txt) do (
  5. set /a count+=1
  6.     if !count! == 4  ren 1-1.txt !i!.txt
  7. )
  8. endlocal
  9. pause
复制代码
写个简单代码不成功。
之前成功打印,发现"tokens=1 delims= "非空行计数,"tokens=1 delims="空行也计数
作者: qixiaobin0715    时间: 2024-4-22 09:50

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1*" %%i in (1-1.txt) do (
  4.     set /a n+=1
  5.     if !n! equ 4 set NFN=%%i
  6. )
  7. ren "1-1.txt" "!NFN!.txt"
  8. pause
复制代码

作者: aloha20200628    时间: 2024-4-22 11:05

本帖最后由 aloha20200628 于 2024-4-22 11:27 编辑

回复 1# meiszp

采用 for 循环读取文本文件会自动剔除空行,因此直接用 set/a n+=1 判断会错行,建议采用skip参数直接跳到目标行n-1。
即便如此,skip之后仍不能及时退出循环而导致反复空读,尤其是当其后有较多文本行时,故此法效率就很低...
建议用以下代码可明显提效,原因是其一能实现及时退出for循环,其二是skip参数会计入空行,其实在楼主前帖 http://www.bathome.net/viewthrea ... ghlight=&page=1 14楼代码中已用过此法...
  1. (call :getN "1-1.txt" 5 nF)
  2. ren "1-1.txt" "%nF%.txt"
  3. :getN
  4.    if %~2 equ 1 for /f "usebackq delims= " %%a in ("%~1") do (set "%~3=%%a"&exit/b)
  5.    set/a "n=%~2-1"
  6.    for /f "usebackq skip=%n% tokens=1 delims= " %%a in ("%~1") do (set "%~3=%%a"&exit/b)
  7.    exit/b
复制代码

作者: 77七    时间: 2024-4-22 11:48

本帖最后由 77七 于 2024-4-22 13:12 编辑
"tokens=1 delims="空行也计数

楼主的文本第二行含有空格,不算空行(写代码可以使用其它文本编辑工具,把显示空格打开,就一目了然...)
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3. call :1 "%%i"
  4. )
  5. pause & exit
  6. :1
  7. (for /l %%l in (1,1,5) do (
  8. set /p str=
  9. ))<"%~1"
  10. for /f "tokens=*" %%a in ("%str%") do (
  11. ren "%~1" "%%~nxa%~x1"
  12. )
  13. exit /b
复制代码

作者: qixiaobin0715    时间: 2024-4-22 11:56

使用临时文件+“伪循环”也可:
  1. @echo off
  2. findstr /n .* 1-1.txt|findstr /b "5:">temp
  3. for /f "tokens=2 delims=: " %%i in (temp) do ren "1-1.txt" "%%i.txt"
  4. del temp
复制代码

作者: meiszp    时间: 2024-4-22 14:10

回复 2# qixiaobin0715
谢谢热心回复
作者: meiszp    时间: 2024-4-22 14:11

回复 3# aloha20200628

谢谢热心回复,代码试验不成功。试验文本已上传
链接: https://pan.baidu.com/s/1WIh9ZwUnGojdq-bJ9JfA4Q?pwd=mmjr
作者: meiszp    时间: 2024-4-22 14:12

本帖最后由 meiszp 于 2024-4-22 14:16 编辑

回复 4# 77七
谢谢热心回复,代码试验不成功,提示“文件名、目录名或卷标语法不正确”。试验文本已上传
链接: https://pan.baidu.com/s/1WIh9ZwUnGojdq-bJ9JfA4Q?pwd=mmjr
作者: meiszp    时间: 2024-4-22 14:12

回复 5# qixiaobin0715

谢谢热心回复。
作者: 77七    时间: 2024-4-22 14:30

回复 8# meiszp


  
  1. SHAANXI BLOWER Co.                                                            
  2.   
  3. ***********************************************************************
  4.     ANALYSIS OF LABYRINTH SEALS       SEAL3D
  5.     101                                                                      
  6. ***********************************************************************
复制代码
论坛输入框右上角点高级模式,点代码,把代码粘贴进去,可以保留文本的制表符。
4楼代码在第10行下增加一行
  1. set "str=%str: =%"
复制代码

作者: aloha20200628    时间: 2024-4-22 14:45

本帖最后由 aloha20200628 于 2024-4-22 14:46 编辑

回复 7# meiszp

以下代码用楼主提供的示例文件测试通过...
  1. @echo off
  2. (call :getN "1-1.txt" 5 nF)
  3. ren "1-1.txt" "%nF%.txt"
  4. exit/b
  5. :getN
  6. if %~2 equ 1 for /f "usebackq delims= " %%s in ("%~1") do (set "%~3=%%s"&exit/b)
  7. set/a "n=%~2-1"
  8. for /f "usebackq skip=%n% delims= " %%s in ("%~1") do (set "%~3=%%s"&exit/b)
  9. exit/b
复制代码

作者: meiszp    时间: 2024-4-22 16:33

回复 11# aloha20200628
第五行,101前面是空格,后面是制表符,所以代码没有完美解决。
delims分隔符用制表符和空格可以解决。
作者: aloha20200628    时间: 2024-4-22 17:48

回复 12# meiszp

很棒!调整getN子过程中的 skip/tokens/delims/... 切割器,完美实现个性化需求
纯P代码中类似getN方法的主要优势就是能 “及时退出循环”,在此前提下没有多余的系统开销,一步到位,尤其是从大体量文本文件中提取部分数据时其功效更加明显...

作者: qixiaobin0715    时间: 2024-4-23 15:34

回复 12# meiszp
如果分隔符只有制表符和空格,delims参数省略即可。




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