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

[文本处理] [已解决]如何用批处理删除文本多余字段?

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
1

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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. )
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

哈哈,有人啦。。谢谢,我试下哈。

TOP

回复 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

TOP

哈哈,有趣的批处理。

TOP

  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填充了,但是也有一些纰漏
复制代码

TOP

TOP

收到,谢谢楼上两位哈。。
早上迟到了。。55

TOP

回复 2# ivor


    !str:~0,7! 可以写成!str:~,7!
1

评分人数

    • CrLf: 乐于助人PB + 3

TOP

ivor 发表于 2012-1-12 21:13



    刚发现出来的间距改变了,可能跟tab有关系,研究代码ing

TOP

回复 10# skywarden


论坛程序会把tab转换成空格

TOP

好纠结啊,为什么非要用复制的才能成功输出,很仔细的对了每个字符了啊,而且都是英文状态
附图
[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列的输出做下处理,要怎么写呢??

TOP

回复 12# skywarden


图没用,你把两个bat文件压缩一下传上来看看。

TOP

悲剧的楼主,居然用记事本写代码~

TOP

本帖最后由 skywarden 于 2012-1-19 16:20 编辑
悲剧的楼主,居然用记事本写代码~
applba 发表于 2012-1-19 16:05


哈哈 ~ ~

notepad++ 可以不?下次复杂的命令就用这个了。。

帮我解决一下第二个问题吧。

TOP

返回列表