Board logo

标题: [文本处理] [已解决]批处理如何提取文本1、2、3栏含三个指定数据的行 [打印本页]

作者: a000000_82    时间: 2012-9-7 18:18     标题: [已解决]批处理如何提取文本1、2、3栏含三个指定数据的行

a.txt内容共四栏,行数二万多。

例如:a.txt内容如下:
xx,xx,99,xx,xx,xx,xx,xx,        66,xx,xx,xx,                          xx,xx,xx,xx,00,xx,                 xx,xx,xx,xx,xx,xx,xx,
xx,xx,xx,xx,xx,88,xx,xx,        xx,xx,xx,xx,xx,xx,77,xx,        xx,xx,xx,44,xx,xx,xx,xx,        xx,xx,xx,xx,xx,
22,xx,                                   xx,xx,xx,22,xx,xx,xx,             xx,xx,xx,22,                         xx,xx,xx,xx,xx,xx,xx,xx,
xx,xx,xx,xx,xx,55,                 xx,33,xx,xx,xx,                      xx,xx,xx,xx,xx,xx,xx,xx,        xx,
xx,xx,xx,xx,22,xx,xx,xx,        xx,xx,xx,xx,xx,xx,xx,22,        xx,22,xx,xx,xx,xx,xx,            xx,xx,xx,xx,xx,xx,xx,xx,


提取出来后b.txt效果如下:
例一:1栏指定数据(22,)、2栏指定数据(22,)、3栏指定数据(22,)。
22,xx,                                   xx,xx,xx,22,xx,xx,xx,             xx,xx,xx,22,                         xx,xx,xx,xx,xx,xx,xx,xx,
xx,xx,xx,xx,22,xx,xx,xx,        xx,xx,xx,xx,xx,xx,xx,22,        xx,22,xx,xx,xx,xx,xx,            xx,xx,xx,xx,xx,xx,xx,xx,

例二:1栏指定数据(99,)、2栏指定数据(66,)、3栏指定数据(00,)。
xx,xx,99,xx,xx,xx,xx,xx,        66,xx,xx,xx,                          xx,xx,xx,xx,00,xx,                 xx,xx,xx,xx,xx,xx,xx,


注:不去重复,不改变顺序。


希望各位大大帮帮忙!!在此先谢谢大家~~~。
作者: FOR    时间: 2012-9-7 18:52

  1. @echo off
  2. set v1=99
  3. set v2=66
  4. set v3=00
  5. (for /f "tokens=1-4 delims= " %%a in (a.txt) do (
  6. set a1=%%a&set a2=%%b&set a3=%%c&set a4=%%d
  7. set /a n=0
  8. setlocal enabledelayedexpansion
  9. set "b1=!a1:%v1%=!"
  10. set "b2=!a2:%v2%=!"
  11. set "b3=!a3:%v3%=!"
  12. if not "!b1!"=="!a1!" set /a n+=1
  13. if not "!b2!"=="!a2!" set /a n+=1
  14. if not "!b3!"=="!a3!" set /a n+=1
  15. if !n! equ 3 echo !a1! !a2! !a3! !a4!
  16. endlocal
  17. ))>b.txt
复制代码

作者: terse    时间: 2012-9-7 19:41

  1. @echo off&setlocal enabledelayedexpansion
  2. set v1=99
  3. set v2=66
  4. set v3=00
  5. (for /f "tokens=1-3*" %%a in (a.txt) do (
  6.         set s1=%%a&set s2=%%b&set s3=%%c
  7.         if "!s1:%v1%,=!" neq "%%a" if "!s2:%v2%,=!" neq "%%b" if "!s3:%v3%,=!" neq "%%c" (
  8.             echo,%%a %%b %%c %%d
  9.        )
  10. ))>c.txt
  11. pause
复制代码

作者: a000000_82    时间: 2012-9-7 20:01

本帖最后由 a000000_82 于 2012-9-7 20:18 编辑

十分感谢FOR、terse 的帮忙!

请您帮忙再修改一下,让栏对齐。
试用效果:
22,xx, xx,xx,xx,22,xx,xx,xx, xx,xx,xx,22, xx,xx,xx,xx,xx,xx,xx,xx,
xx,xx,xx,xx,22,xx,xx,xx, xx,xx,xx,xx,xx,xx,xx,22, xx,22,xx,xx,xx,xx,xx, xx,xx,xx,xx,xx,xx,xx,xx,

要求效果:
22,xx,                                   xx,xx,xx,22,xx,xx,xx,             xx,xx,xx,22,                     xx,xx,xx,xx,xx,xx,xx,xx,
xx,xx,xx,xx,22,xx,xx,xx,        xx,xx,xx,xx,xx,xx,xx,22,        xx,22,xx,xx,xx,xx,xx,        xx,xx,xx,xx,xx,xx,xx,xx,

注:要求栏对齐是为了复制第4栏。

另:如果可能的话将提取后的第4栏直接提取出来。
作者: FOR    时间: 2012-9-7 21:00

对齐是件极其啰唆的事,要知道你整个文本中最长的一列有多少字符,还要考虑其中的全角字符,对于你这么大的文档来说,效率是不敢恭维的。
作者: a000000_82    时间: 2012-9-7 21:12

请教一下,能否在不对齐的情况下将第四栏提取出来。
作者: FOR    时间: 2012-9-7 21:58

请教一下,能否在不对齐的情况下将第四栏提取出来。
a000000_82 发表于 2012-9-7 21:12


4.txt 为第四栏的结果
  1. @echo off
  2. set v1=99
  3. set v2=66
  4. set v3=00
  5. for /f "tokens=1-4 delims= " %%a in (a.txt) do (
  6.         set a1=%%a&set a2=%%b&set a3=%%c&set a4=%%d
  7.         set /a n=0
  8.         setlocal enabledelayedexpansion
  9.         set "b1=!a1:%v1%=!"
  10.         set "b2=!a2:%v2%=!"
  11.         set "b3=!a3:%v3%=!"
  12.         if not "!b1!"=="!a1!" set /a n+=1
  13.         if not "!b2!"=="!a2!" set /a n+=1
  14.         if not "!b3!"=="!a3!" set /a n+=1
  15.         if !n! equ 3 (
  16.          echo !a1! !a2! !a3! !a4!>>b.txt
  17.          echo !a4!>>4.txt
  18.         )
  19.         endlocal
  20. )
复制代码

作者: a000000_82    时间: 2012-9-7 22:38

非常好用,麻烦您了,非常感谢!!!
作者: sm00789    时间: 2012-9-10 20:07

高手如云啊




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