Board logo

标题: [文本处理] 【已解决】批处理如何文件夹下提取所有txt文件的固定位置字符和某一行合并? [打印本页]

作者: willurpimd    时间: 2023-4-13 08:33     标题: 【已解决】批处理如何文件夹下提取所有txt文件的固定位置字符和某一行合并?

本帖最后由 willurpimd 于 2023-4-18 08:50 编辑

哪位大神帮下,用bat批处理:
在一个文件夹里所有txt文档(几百个)的格式相同,分隔符间隔
需要将每个文档第二行第一列的字符串作为新txt文档的第二列第一个字符串,后面跟着每个文档的第五行所有字符,将每个文档按行排列进行组成,生成新的txt文件

比如文件夹所有文档的格式是:

ID           User           Recipe
#21         Unknown        S11
12           11              23
aa           bb              cc
0.25        351            352          852        854      8541
eg           er               er             er


新的行显示
#21      0.25        351             352          852        854      8541
然后每个txt按行排列成新的一个txt文件

下面的云盘内有3个测试文件
https://wwlf.lanzoue.com/i2id90suy4re
作者: Batcher    时间: 2023-4-13 08:37

回复 1# willurpimd


    请选2个txt文件打包上传到网盘,以便测试代码。
作者: willurpimd    时间: 2023-4-13 08:58

回复 2# Batcher


好的,已上传
https://wwlf.lanzoue.com/i2id90suy4re
作者: czjt1234    时间: 2023-4-13 10:15

新的txt文件,文件内容如何?
  1. ID User Recipe
  2. #21 0.25 351 352 852 854 8541
  3. #25 35 121 562 82 345 534
  4. #28 455 67 743 12 235 124
复制代码
还是
  1. #21 0.25 351 352 852 854 8541
  2. #25 35 121 562 82 345 534
  3. #28 455 67 743 12 235 124
复制代码

作者: willurpimd    时间: 2023-4-13 10:33

回复 4# czjt1234


   是第二个
作者: qixiaobin0715    时间: 2023-4-13 10:43

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
  4.     for /f "tokens=1,2* delims=: " %%i in ('findstr /n . "%%a"^|findstr "^2: ^5:"') do (
  5.         if %%i equ 5 echo,!str! %%j %%k
  6.         set str=%%j
  7.     )
  8. ))>New.txt
  9. pause
复制代码

作者: willurpimd    时间: 2023-4-15 22:46

回复 6# qixiaobin0715

感谢,能否解释下语句的意思?
作者: hfxiang    时间: 2023-4-16 11:07

回复 1# willurpimd
  1. gawk -vOFS="\t" "FNR==2{a=$1}FNR==5{print a,$0}" "D:\data\*.txt">"D:\Result\NEW.txt"
复制代码
http://bcn.bathome.net/tool/4.1.0/gawk.exe
作者: terse    时间: 2023-4-16 11:53

处理文件多的话 可以这样处理
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
  3.      set n=0
  4.      set "str="
  5.      for /f "skip=1 usebackq tokens=1*" %%i in ("%%a") do (
  6.           if defined str (
  7.              set /a n+=1
  8.              if !n! equ 3 (echo,!str! %%i %%j)
  9.           ) else set str=%%i
  10.     )
  11. ))>res.txt
复制代码

作者: willurpimd    时间: 2023-4-18 08:50

回复 9# terse


  确实运行速度很快,感谢!
作者: qixiaobin0715    时间: 2023-4-18 09:52

如果总是取文本以#号开头的行及其后第3行作为目标的话,实际上使用一个for循环也能解决:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims= " %%i in ('type *.txt 2^>nul') do (
  4.     set "str1=%%i"
  5.     if "!str1:~,1!"=="#" (
  6.         set "str2=%%i"
  7.         set n=0
  8.     ) else if defined n (
  9.         set /a n+=1
  10.         if !n! equ 3 (
  11.             echo,!str2! %%i %%j
  12.             set n=
  13.         )
  14.     )
  15. ))>New.txt
  16. pause
复制代码





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