Board logo

标题: [文本处理] [已解决]如何用批处理删除文本多余字段? [打印本页]

作者: 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 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1-7" %%a in (2012-01-12-1.TXT) do (
  3.         set str=%%e
  4.         echo %%a %%b %%c %%d !str:~0,7! %%f %%g >>b.txt
  5. )
复制代码

作者: 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

  1. @echo off & setlocal enabledelayedexpansion
  2. ::关闭回显  and  开启变量延迟扩展为了!str!
  3. for /f "tokens=1-7" %%a in (2012-01-12-1.TXT) do (
  4.         set str=%%e
  5. echo %%a %%b %%c %%d !str:~0,10! %%f %%g >>b.txt
  6. )
  7. ::把%%e的值传给环境变量str,以便后边可以用!str:~0,7!
  8. ::!str:~0,7!的意思是 从0位开始到第七位的字符串,后面的就不要了,可以set /?看详细解释
  9. :: 如果想改成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
  1. @echo off
  2. SETLOCAL EnablEdElayEdExpansion
  3. rem 下面这句定义两列之间的空格数
  4. set "sp=                 "
  5. (for /f "delims=" %%i in (tel.txt) do (
  6.   set "a=%%i"
  7.   echo !a:~0,54!!sp!!a:~71!
  8. ) )>new.txt
  9. 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