标题: [文本处理] [已解决]如何用批处理删除文本多余字段? [打印本页]
作者: skywarden 时间: 2012-1-12 14:47 标题: [已解决]如何用批处理删除文本多余字段?
T20120112113150 000046 850 850 5399200 08 0.00
T20120112113202 000122 807 807 2237887 08 0.00
T20120112113304 000024 810 810 6108331 08 0.00
T20120112113032 000310 812 812 5794878 08 0.00
T20120112113001 000417 833 833 5715156613 08 0.00
文本名为2012-01-12-1.TXT,上面是文本内容。
如何读取该文本,并限定第5列数值不超过7位,如果超出位数自动删除多余位数并保存。
把下面这一列
T20120112113001 000417 833 833 5715156613 08 0.00
变为
T20120112113001 000417 833 833 5715156 08 0.00
谢谢
我算了一下,是从第47个字符开始的,截取48至71之间的数值,只要7位数。
5715156到08 0.00 之间是固定24格,从5-0是24格,从6至0是17格。
问题简化为如何用批处理读取文本,并删除每行从54到71之间的数字并填充为空。
谢谢各位。特别感谢applba和ivor
作者: ivor 时间: 2012-1-12 18:26
本帖最后由 ivor 于 2012-1-12 18:33 编辑
- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1-7" %%a in (2012-01-12-1.TXT) do (
- set str=%%e
- echo %%a %%b %%c %%d !str:~0,7! %%f %%g >>b.txt
-
- )
复制代码
作者: skywarden 时间: 2012-1-12 18:42
哈哈,有人啦。。谢谢,我试下哈。
作者: skywarden 时间: 2012-1-12 20:50
回复 2# ivor
好像可以了哈,,非常感谢。。能不能帮我解释一下代码的意思呢。。
如果我要截取的位数是16位,是不是只要更改"tokens=1-7"和str:~0,7! 就可以了。
我刚改成10的会变成这样子的。后面的格式会乱掉,还请帮忙再调试一下,谢谢。
T20120112113121 000029 810 810 2367265 08 0.00
T20120112113104 000059 821 821 5530459# 08 0.00
T20120112112909 000325 808 808 153069828000 08 0.00
T20120112113150 000046 850 850 5399200 08 0.00
T20120112113202 000122 807 807 2237887 08 0.00
T20120112113304 000024 810 810 6108331 08 0.00
T20120112113032 000310 812 812 5794878 08 0.00
T20120112113001 000417 833 833 571515661300 08 0.00
作者: skywarden 时间: 2012-1-12 20:50
哈哈,有趣的批处理。
作者: ivor 时间: 2012-1-12 21:13
- @echo off & setlocal enabledelayedexpansion
- ::关闭回显 and 开启变量延迟扩展为了!str!
- for /f "tokens=1-7" %%a in (2012-01-12-1.TXT) do (
- set str=%%e
- echo %%a %%b %%c %%d !str:~0,10! %%f %%g >>b.txt
- )
- ::把%%e的值传给环境变量str,以便后边可以用!str:~0,7!
- ::!str:~0,7!的意思是 从0位开始到第七位的字符串,后面的就不要了,可以set /?看详细解释
- :: 如果想改成10,改变 !str:~0,10! 就可以了,注意输出的格式。字符串之间我已经用TAB填充了,但是也有一些纰漏
复制代码
作者: find 时间: 2012-1-12 21:40
回复 4# skywarden
http://www.bathome.net/thread-996-1-1.html
http://www.bathome.net/thread-40-1-1.html
http://www.bathome.net/thread-1149-1-1.html
作者: skywarden 时间: 2012-1-13 09:55
收到,谢谢楼上两位哈。。
早上迟到了。。55
作者: Hello123World 时间: 2012-1-13 13:01
回复 2# ivor
!str:~0,7! 可以写成!str:~,7!
作者: skywarden 时间: 2012-1-16 16:15
ivor 发表于 2012-1-12 21:13
刚发现出来的间距改变了,可能跟tab有关系,研究代码ing
作者: find 时间: 2012-1-16 19:36
回复 10# skywarden
论坛程序会把tab转换成空格
作者: skywarden 时间: 2012-1-19 10:44
好纠结啊,为什么非要用复制的才能成功输出,很仔细的对了每个字符了啊,而且都是英文状态
附图
[attach]4860[/attach]
123.bat输出不了,ivor.bat是直接复制的代码可以运行。
求解如下问题:
token=1-7 指的是1到7列字符串是吗?以空格为分隔符。
%%e对应的是!str:~0,7!(偏移0,截取第5列从左到右7个字符)
%%a、%%b、%%c、%%d、%%f、%%g对应的是第1、2、3、4、6、7列
他们之间的间隔是多少呢?对应要提取的文本里面的实际间距吗?
最后代码写成6行,只是为了好看吗?可不可以写成2行。
如:
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1-7" %%a in (tel.txt) do (set str=%%e echo %%a %%b %%c %%d !str:~0,7! %%f %%g >>c.txt)
再附张图说明
[attach]4863[/attach]
附代码
[attach]4864[/attach][attach]4865[/attach]
我重打了一遍代码就可以了,唉。。
不知道有没有什么工具可以查询看是哪个字符出错的。。
那个间距差不多搞明白了,set str=%%e之后是要回车,echo不能同行,不然输出为空。
%%a %%b之间输出的间距是对应实际要输出的。
%%a空一格%%b空一格%%c空13格%%d以此类推。
现在的问题是截取的字符会影响到后面输出的格式,如图。
[attach]4866[/attach]
我觉得应该要对第6列的输出做下处理,要怎么写呢??
作者: find 时间: 2012-1-19 10:52
回复 12# skywarden
图没用,你把两个bat文件压缩一下传上来看看。
作者: applba 时间: 2012-1-19 16:05
悲剧的楼主,居然用记事本写代码~
作者: skywarden 时间: 2012-1-19 16:15
本帖最后由 skywarden 于 2012-1-19 16:20 编辑
悲剧的楼主,居然用记事本写代码~
applba 发表于 2012-1-19 16:05
哈哈 ~ ~
notepad++ 可以不?下次复杂的命令就用这个了。。
帮我解决一下第二个问题吧。
作者: applba 时间: 2012-1-19 17:19
本帖最后由 applba 于 2012-1-19 18:57 编辑
回复 15# skywarden - @echo off
- SETLOCAL EnablEdElayEdExpansion
- rem 下面这句定义两列之间的空格数
- set "sp= "
-
- (for /f "delims=" %%i in (tel.txt) do (
- set "a=%%i"
- echo !a:~0,54!!sp!!a:~71!
- ) )>new.txt
-
- pause
复制代码
作者: skywarden 时间: 2012-1-19 18:22
回复 16# applba
我看到了哈,,非常感谢,,有事要晚点才能测试了。。
作者: skywarden 时间: 2012-1-20 10:48
回复 16# applba
哇噻。。这代码太给力了。。谢谢哈~ ~
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |