[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理删除文件中的特定字符和长度不足N的所有行

小声接触批处理不久,所以对这么复杂的东西无从下手,希望大虾不吝赐教,感谢之至啊!
正文开始(文本样例)
文本1
111
1112      异常区域
3331
……
1231

文本2和文本1类似如下
1231
12314   
1233    异常区域
2344


这些文本在初始状态只应该有数字(当然回车换行是有的),且每行长度应为4;
此为货物编码,异常区域表示文本中可能会存在的比如空格、汉字、其他数字的东西

目的:
1、删除文本中的所有包含非数字的行(不含回车换行)
2、删除文本中长度不等于4的行(不允许有空行)
3、在每一行后面增加'F,0,F,00'字符串
4、计算本目录下的所有文本文件的总行数(比如文件1为10行,文件2为90行,那么返回100行)

我的目的是上面的,思路也和上面差不多,但是不知道咋写出来

[ 本帖最后由 cleariver 于 2010-4-6 01:18 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

文件最后一行必须是空行,否则会丢失最后一行
  1. @echo off
  2. md tem
  3. for /f "tokens=1* delims=:" %%i in ('findstr /be "[0-9][0-9]*" *.txt') do (
  4.    set "lr=%%j"
  5.    setlocal enabledelayedexpansion
  6.    if "!lr:~4,1!"=="" (
  7.       if not "!lr:~3,1!"=="" (
  8.          endlocal
  9.          >>tem\%%~ni.txt echo %%j F,0,F,00
  10.          set /a n+=1
  11.        )
  12.      ) else endlocal
  13. )
  14. echo 新文件在 tem 文件夹中,按任意键打开。。。
  15. echo.&echo 总行数 %n% 行
  16. pause>nul
  17. start tem
复制代码

TOP

“计算本目录下的所有文本文件的总行数”,是处理前的总行数还是处理后的总行数?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

处理后的总行数,我想了好久了,就是不知道咋写,崩溃

TOP

to FOR:文本的最后一行我也不能是空行,否则我做出来的文件,俺系统不识别

to 管理:是处理所有文本结束后,所有文本的总行数

TOP

  思路:for获取所有txt文件列表,用findstr在这些文件中抽取有且只有4个数字的行,放入新文件中,每提取到一行,计数器就+1。
  1. @echo off
  2. md tmp 2>nul
  3. set num=0
  4. for %%i in (*.txt) do (
  5.     cd.>tmp\%%i
  6.     for /f %%j in ('findstr /be "[0-9][0-9][0-9][0-9]" %%i') do (
  7.         (echo %%jF,0,F,00)>>tmp\%%i
  8.         set /a num+=1
  9.     )
  10. )
  11. echo 处理后的数据放在 tmp 文件夹下
  12. echo 处理后的所有文本文件总行数为 %num% 行
  13. pause
复制代码
=======================================
  忘记在每行后添加 F,0,F,00 了,修改一下下。另外,偷偷修改了一处笔误。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

to FOR 代码中多了一个空格,我改了下;另外如果执行2次后,会出现数据被重复记录到tem下的同名文件中,所以我稍微改了下,用着还不错 ,就是能不能把最后一行的空行给取消了啊

另外还没测试大文件,我明天上班测试下看看,多谢FOR
  1. @echo off
  2. rmdir /S /Q tem >nul
  3. md tem >nul
  4. for /f "tokens=1* delims=:" %%i in ('findstr /be "[0-9][0-9]*" *.txt') do (
  5.    set "lr=%%j"
  6.    setlocal enabledelayedexpansion
  7.    if "!lr:~4,1!"=="" (
  8.       if not "!lr:~3,1!"=="" (
  9.          endlocal
  10.          >>tem\%%~ni.txt echo %%jF,0,F,00
  11.          set /a n+=1
  12.        )
  13.      ) else endlocal
  14. )
  15. echo 新文件在 tem 文件夹中,按任意键打开。。。
  16. echo.&echo 总行数 %n% 行
  17. pause>nul
  18. start tem
复制代码

TOP

to namejm兄:思路很好,非常棒,就是有一点不太满足我的意思
假设我们有这么一行数据  12A23  那么这个数字他本身应该是有效的啊 只要删除这个数字就好了  你觉得呢
不过这个思路确实猛,真没想到过啊

TOP

findstr /be "[0-9][0-9][0-9][0-9] 我怎么没想到呢~
先删除tem文件夹再重建就不会累加记录了,但需注意备份tem
  1. @echo off
  2. rem 删除tem文件夹,注意备份。。。
  3. rd /s /q tem
  4. md tem
  5. for /f "tokens=1* delims=:" %%i in ('findstr /be "[0-9][0-9][0-9][0-9]" *.txt') do (
  6.    >>tem\%%i echo %%j F,0,F,00
  7.    set /a n+=1
  8. )
  9. echo 新文件在 tem 文件夹中,按任意键打开。。。
  10. echo.&echo 总行数 %n% 行
  11. pause>nul
  12. start tem
复制代码

TOP

原帖由 cleariver 于 2010-4-6 00:18 发表
假设我们有这么一行数据  12A23  那么这个数字他本身应该是有效的啊 只要删除这个数字就好了  你觉得呢


  根据你的描述:
1、删除文本中的所有包含非数字的行(不含回车换行)
2、删除文本中长度不等于4的行(不允许有空行)

  我得出的结论是:你需要的内容是纯数字行,并且,这个数字长度是4。很明显,12A23 这行是应该排除在外的。

  如果你需要 12A23 这样的行,那么,你的顶楼的描述是有问题的,请你修改一下,力求精确,以免大家误解。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

to 管理、FOR
    这个代码改的确实很有水平,偶相当的佩服啊。
   处理速度上有些慢了,特别是当我们选择6位日期4位货号排列的话,那样我们就会有10个数字
   1004051234 速度上有些慢;况且目录下一般都会有大约20-40个文件,每个文件大约有10W行左右

  还能做什么优化的不?

TOP

to 管理,我弄错了,12A34这个行 真不需要  瀑布汗啊,对不起!

TOP

好像被我越搞越复杂,不过不用findstr应该会快点吧?
  1. @echo off&md tem 2>nul
  2. rem 这里设置数字的数量
  3. set /a m=4
  4. set /a h=m+1
  5. for %%i in (*.txt) do (
  6.     cd.>"tem\%%i"
  7.     for /f "usebackq delims=" %%j in ("%%i") do (
  8.         set "lr=%%ja"
  9.         setlocal enabledelayedexpansion
  10.         if "!lr:~%h%,1!"=="" (
  11.            if not "!lr:~%m%,1!"=="" (
  12.            for /l %%L in (0 1 9) do set "lr=!lr:%%L=!"
  13.            if "!lr!"=="a" (
  14.               endlocal
  15.               set /a n+=1
  16.               >>"tem\%%i" echo %%j
  17.             ) else endlocal
  18.           )
  19.         ) else endlocal
  20.     )
  21. )
  22. for %%i in (tem\*.txt) do if %%~zi equ 0 del/q "%%i"
  23. echo 新文件在 tem 文件夹中,按任意键打开。。。
  24. echo.&echo 总行数 %n% 行
  25. pause>nul
  26. start tem
复制代码

[ 本帖最后由 FOR 于 2010-4-6 01:21 编辑 ]
1

评分人数

TOP

多谢楼上各位啊,明天上班我仔细测试下,非常感谢;祝大家晚安!


to FOR,测试结果很满意,可以第二次修改,不错啊;思路是参考管理的思路的那个代码;

to 管理:你修改后的代码有时候会出现目的文件为空的情况;出现这种问题的情况找到了

如果我的原始文件内容长度全部为13,比如1234567890123,我要在后面添加长度为16,比如ABABABA,0909,0,1

那么就会在bat上出现滚动的数据,如1234567890123ABABABA,0909,0,  缺少最后一位;
但是for兄弟的不少,不知道为啥

[ 本帖最后由 cleariver 于 2010-4-7 00:49 编辑 ]

TOP

  当字符串的最后一位数字是被空格键、跳格键、逗号、分号、等号之类分隔出来的话,将会被作为句柄号处理,在echo的时候将被丢弃。

  解决的方法有多种:
  1、把重定向符号之前的语句用括号括起来,写成 (echo 123,2)>test.txt 这种格式;
  2、把重定向符号及其之后的字符串前置,放到 echo 语句之前,写成 >test.txt echo 123,2 这样的格式。

  6楼的代码已经修正过,能正确处理这种情形。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表