标题: [文本处理] [已解决]批处理删除文件中的特定字符和长度不足N的所有行 [打印本页]
作者: cleariver 时间: 2010-4-5 22:23 标题: [已解决]批处理删除文件中的特定字符和长度不足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 编辑 ]
作者: FOR 时间: 2010-4-5 23:02
文件最后一行必须是空行,否则会丢失最后一行- @echo off
- md tem
- for /f "tokens=1* delims=:" %%i in ('findstr /be "[0-9][0-9]*" *.txt') do (
- set "lr=%%j"
- setlocal enabledelayedexpansion
- if "!lr:~4,1!"=="" (
- if not "!lr:~3,1!"=="" (
- endlocal
- >>tem\%%~ni.txt echo %%j F,0,F,00
- set /a n+=1
- )
- ) else endlocal
- )
- echo 新文件在 tem 文件夹中,按任意键打开。。。
- echo.&echo 总行数 %n% 行
- pause>nul
- start tem
复制代码
作者: namejm 时间: 2010-4-5 23:08
“计算本目录下的所有文本文件的总行数”,是处理前的总行数还是处理后的总行数?
作者: cleariver 时间: 2010-4-5 23:44
处理后的总行数,我想了好久了,就是不知道咋写,崩溃
作者: cleariver 时间: 2010-4-5 23:47
to FOR:文本的最后一行我也不能是空行,否则我做出来的文件,俺系统不识别
to 管理:是处理所有文本结束后,所有文本的总行数
作者: namejm 时间: 2010-4-6 00:00
思路:for获取所有txt文件列表,用findstr在这些文件中抽取有且只有4个数字的行,放入新文件中,每提取到一行,计数器就+1。- @echo off
- md tmp 2>nul
- set num=0
- for %%i in (*.txt) do (
- cd.>tmp\%%i
- for /f %%j in ('findstr /be "[0-9][0-9][0-9][0-9]" %%i') do (
- (echo %%jF,0,F,00)>>tmp\%%i
- set /a num+=1
- )
- )
- echo 处理后的数据放在 tmp 文件夹下
- echo 处理后的所有文本文件总行数为 %num% 行
- pause
复制代码
=======================================
忘记在每行后添加 F,0,F,00 了,修改一下下。另外,偷偷修改了一处笔误。
作者: cleariver 时间: 2010-4-6 00:07
to FOR 代码中多了一个空格,我改了下;另外如果执行2次后,会出现数据被重复记录到tem下的同名文件中,所以我稍微改了下,用着还不错 ,就是能不能把最后一行的空行给取消了啊
另外还没测试大文件,我明天上班测试下看看,多谢FOR- @echo off
- rmdir /S /Q tem >nul
- md tem >nul
- for /f "tokens=1* delims=:" %%i in ('findstr /be "[0-9][0-9]*" *.txt') do (
- set "lr=%%j"
- setlocal enabledelayedexpansion
- if "!lr:~4,1!"=="" (
- if not "!lr:~3,1!"=="" (
- endlocal
- >>tem\%%~ni.txt echo %%jF,0,F,00
- set /a n+=1
- )
- ) else endlocal
- )
- echo 新文件在 tem 文件夹中,按任意键打开。。。
- echo.&echo 总行数 %n% 行
- pause>nul
- start tem
复制代码
作者: cleariver 时间: 2010-4-6 00:18
to namejm兄:思路很好,非常棒,就是有一点不太满足我的意思
假设我们有这么一行数据 12A23 那么这个数字他本身应该是有效的啊 只要删除这个数字就好了 你觉得呢
不过这个思路确实猛,真没想到过啊
作者: FOR 时间: 2010-4-6 00:19
findstr /be "[0-9][0-9][0-9][0-9] 我怎么没想到呢~
先删除tem文件夹再重建就不会累加记录了,但需注意备份tem- @echo off
- rem 删除tem文件夹,注意备份。。。
- rd /s /q tem
- md tem
- for /f "tokens=1* delims=:" %%i in ('findstr /be "[0-9][0-9][0-9][0-9]" *.txt') do (
- >>tem\%%i echo %%j F,0,F,00
- set /a n+=1
- )
- echo 新文件在 tem 文件夹中,按任意键打开。。。
- echo.&echo 总行数 %n% 行
- pause>nul
- start tem
复制代码
作者: namejm 时间: 2010-4-6 00:34
原帖由 cleariver 于 2010-4-6 00:18 发表
假设我们有这么一行数据 12A23 那么这个数字他本身应该是有效的啊 只要删除这个数字就好了 你觉得呢
根据你的描述:
1、删除文本中的所有包含非数字的行(不含回车换行)
2、删除文本中长度不等于4的行(不允许有空行)
我得出的结论是:你需要的内容是纯数字行,并且,这个数字长度是4。很明显,12A23 这行是应该排除在外的。
如果你需要 12A23 这样的行,那么,你的顶楼的描述是有问题的,请你修改一下,力求精确,以免大家误解。
作者: cleariver 时间: 2010-4-6 00:39
to 管理、FOR
这个代码改的确实很有水平,偶相当的佩服啊。
处理速度上有些慢了,特别是当我们选择6位日期4位货号排列的话,那样我们就会有10个数字
1004051234 速度上有些慢;况且目录下一般都会有大约20-40个文件,每个文件大约有10W行左右
还能做什么优化的不?
作者: cleariver 时间: 2010-4-6 00:42
to 管理,我弄错了,12A34这个行 真不需要 瀑布汗啊,对不起!
作者: FOR 时间: 2010-4-6 01:10
好像被我越搞越复杂,不过不用findstr应该会快点吧?
- @echo off&md tem 2>nul
- rem 这里设置数字的数量
- set /a m=4
- set /a h=m+1
- for %%i in (*.txt) do (
- cd.>"tem\%%i"
- for /f "usebackq delims=" %%j in ("%%i") do (
- set "lr=%%ja"
- setlocal enabledelayedexpansion
- if "!lr:~%h%,1!"=="" (
- if not "!lr:~%m%,1!"=="" (
- for /l %%L in (0 1 9) do set "lr=!lr:%%L=!"
- if "!lr!"=="a" (
- endlocal
- set /a n+=1
- >>"tem\%%i" echo %%j
- ) else endlocal
- )
- ) else endlocal
- )
- )
- for %%i in (tem\*.txt) do if %%~zi equ 0 del/q "%%i"
- echo 新文件在 tem 文件夹中,按任意键打开。。。
- echo.&echo 总行数 %n% 行
- pause>nul
- start tem
复制代码
[ 本帖最后由 FOR 于 2010-4-6 01:21 编辑 ]
作者: cleariver 时间: 2010-4-6 01:16
多谢楼上各位啊,明天上班我仔细测试下,非常感谢;祝大家晚安!
to FOR,测试结果很满意,可以第二次修改,不错啊;思路是参考管理的思路的那个代码;
to 管理:你修改后的代码有时候会出现目的文件为空的情况;出现这种问题的情况找到了
如果我的原始文件内容长度全部为13,比如1234567890123,我要在后面添加长度为16,比如ABABABA,0909,0,1
那么就会在bat上出现滚动的数据,如1234567890123ABABABA,0909,0, 缺少最后一位;
但是for兄弟的不少,不知道为啥
[ 本帖最后由 cleariver 于 2010-4-7 00:49 编辑 ]
作者: namejm 时间: 2010-4-7 01:19
当字符串的最后一位数字是被空格键、跳格键、逗号、分号、等号之类分隔出来的话,将会被作为句柄号处理,在echo的时候将被丢弃。
解决的方法有多种:
1、把重定向符号之前的语句用括号括起来,写成 (echo 123,2)>test.txt 这种格式;
2、把重定向符号及其之后的字符串前置,放到 echo 语句之前,写成 >test.txt echo 123,2 这样的格式。
6楼的代码已经修正过,能正确处理这种情形。
作者: namejm 时间: 2010-4-7 01:25
原帖由 cleariver 于 2010-4-6 00:39 发表
to 管理、FOR
处理速度上有些慢了,特别是当我们选择6位日期4位货号排列的话,那样我们就会有10个数字
1004051234 速度上有些慢;况且目录下一般都会有大约20-40个文件,每个文件大约有10W行左右
还能做什么优化的不?
从你顶楼的描述来看,我看不出你是如何操纵6位日期4位货号的,你根本就没有提及你的具体处理流程,恕我无法模拟你的情境。希望你能完整地描述你的实际情况,必要的时候,请以附件的方式提供部分原始数据——不要把数据直接发在帖子正文中,网页会把部分特殊字符做变形处理。
作者: FOR 时间: 2010-4-7 01:46
当字符串的最后一位数字是被空格键、跳格键、逗号、分号、等号之类分隔出来的话,将会被作为句柄号处理,在echo的时候将被丢弃。
好像在for中以变量形式时不会这样吧?
作者: cleariver 时间: 2010-4-8 07:48
好,感谢各位,我下周提供一份原始数据,我们每周一才会出原始数据,多谢哈兄弟们!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |