Board logo

标题: [文本处理] 如何用批处理让文本内容按条件删除数据? [打印本页]

作者: czvde    时间: 2022-4-2 11:42     标题: 如何用批处理让文本内容按条件删除数据?

本帖最后由 czvde 于 2022-4-5 13:17 编辑

文件夹有多个txt文件
a.txt
b.txt
c.txt
d.txt

例如:a.txt的文本内容
  1. ----------
  2. 111111
  3. AAAAAA
  4. ----------
  5. 111111
  6. BBBBBBBB
  7. ----------
  8. ABC
  9. 111111
  10. ABC
  11. CCCCC
复制代码
排序,输出a-1.txt、b-1.txt、c-1.txt、d-1.txt

a-1.txt的文本内容
  1. ----------
  2. 111111
  3. BBBBBBBB
  4. ----------
  5. ABC
  6. CCCCC
复制代码
补充说明要求:
根据文本中的“----------”行内容与第1次重复“----------”行内容作为判断,进行删除(效果看a-1.txt)
根据文本中的“ABC”行内容与第1次重复“ABC”行内容作为判断,进行删除(效果看a-1.txt)
作者: buyiyang    时间: 2022-4-3 11:52

本帖最后由 buyiyang 于 2022-4-3 12:58 编辑

你又来啦,这个问题我有一个思路,但水平太菜,代码撸不出,不过我觉得分享讨论一下思路也不错(符合本版的”注意“)
1.首先用for和findstr找出"----------"所在的行号,
  1. for %%i in (*.txt) do (
  2. for /f "tokens=1* delims=:" %%a in ('findstr /n /r /c:"----------" "%%i"') do (……)
复制代码
2.将上述相邻的的一对行号作为一对变量,%m%和%n%,并分别对应,
比如a.txt的例子,行号有1、4、8,当%m%=1时%n%=4,当%m%=4时%n%=8,
我想到的是将找出的所有行号变成一串字符,再用set截取变成两组变量的值,再用for进行提取并用for的嵌套使%m%和%n%分别对应,比如1=4=8=截取为1=4和4=8(加上=是方便for提取)
  1. for /f "tokens=1* delims=:" %%a in ('findstr /n /r /c:"----------" "%%i"') do >>by.txt echo,%%a
  2. for /f "delims=" %%a in (by.txt) do (set /p=%%a=<nul>>byy.txt)
  3. for /f "delims=" %%a in (byy.txt) do set "str=%%a"
  4. set "str1=!str:~0,-3!
  5. set "str2=!str:~2,-1!
  6. for %%a in (!str1!) do (
  7. set "m=%%a"
  8. for %%a in (!str2!) do (
  9. set "n=%%a"
复制代码
3.最后再根据%m%获得----------下一行的行号%x%,再根据%x用for和%findstr找出----------下一行的内容%str3%,再找出%str3%在文本中的所有行号%y%,
如果%y%geq%m%,当%y%gtr%n%,则删除%m%到%n%-1行的内容,
当%y%lss%n%,则输出%m%行,%y%到%n%-1行的内容或删除%m+1%到%y%-1的内容。。




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