中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 未结:过滤一个文件里所有字符串两头的TAB和空格?
« [1] [2] »
作者:
标题: 未结:过滤一个文件里所有字符串两头的TAB和空格? 上一主题 | 下一主题
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『楼 主』:  未结:过滤一个文件里所有字符串两头的TAB和空格?

想的我头发都掉了两根,没想出来简单的方法。

一个test.txt 文件里字符串直接都用逗号“,”分隔的,有4列字符串。
但是每个字符串两头可能会有N个TAB或空格,需要把他们过滤掉。但咬保留字符串里的空格。批处理读取的时候可以忽略空行。

高手请帮忙啊!多谢! ****** test.txt 测试文件,请见附件********
次文件是BAT的配置文件,BAT读取里面的数据做相应操作。
相信肯定会很有用。
test.txt
-------------------------------------------------------------------------------
test 1, , ,

test 2 ,     test 2 ,   [TAB]  test 3   [TAB]    ,   [TAB]    test 4   [TAB]
test 2 ,      [TAB]test 2 ,   test 3   [TAB]    ,   [TAB]    test 4   [TAB]

test 2,ss , ,
test2 ,     test 2 ,   [TAB]  [TAB] test 3   [TAB]    ,   [TAB]    test 4   [TAB]

-------------------------------------------------------------------------------

[ Last edited by uiopuiop on 2008-8-25 at 10:36 PM ]

附件 1: TEST.TXT (2008-8-22 23:24, 1.3 K,下载次数: 15)
2008-8-21 21:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


@echo off & Setlocal EnableDelayedExpansion

for /f "tokens=1-4 delims=," %%a in (bc.txt) do (
    for %%m in ("%%a", "%%b", "%%c", "%%d") do (
        set name=%%~m
        set name=!name:        =!
        set /a num+=1,re=num%%4
        for /f "tokens=*" %%n in ("!name!") do if "!re!"=="0" (echo/%%~nxn) else (set/p=%%~nxn,<nul)
    )
)
注意,第2个set其实是set name=!name:[TAB]=!

[ Last edited by lxmxn on 2008-8-22 at 01:57 AM ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 uiopuiop 分数: +2  时间:2008-8-22 10:41


2008-8-22 01:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
FQ
社区乞丐





积分 -61
发帖 37
注册 2008-4-19
状态 离线
『第 3 楼』:  

通用性比较好,不过有一个弊病,哎
@echo off&setlocal
for /f "tokens=*" %%a in (test.csv) do call :FQ %%a
goto :eof
:FQ
set "c=%*"
for %%b in ("%c:,=" "%") do call :aoyun %%~b
set/p= <nul
echo.
goto:eof
:aoyun
<nul,set/p=%*,


   此帖被 +1 点积分    点击查看详情   
评分人:【 uiopuiop 分数: +1  时间:2008-8-22 23:28


2008-8-22 13:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 4 楼』:  

直接CSV里面VBA

Dim r As Range
For Each r In UsedRange.Cells
     r.Value = Trim(r.Value)
Next

2008-8-22 14:22
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 5 楼』:  

回版主,先谢一下!
不过发现你的算法有时候会有问题,当csv 文件有几项的值为空时,就会出错:
数据会发生错位。
例如

reqwre, reqre, reqre, rewqre
rere, , ,
tt, tt,
add,ddsa,fdaf,dfafd

[ Last edited by uiopuiop on 2008-8-22 at 08:57 PM ]

2008-8-22 20:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by FQ at 2008-8-22 01:25 PM:
通用性比较好,不过有一个弊病,哎
[code]
@echo off&setlocal
for /f "tokens=*" %%a in (test.csv) do call :FQ %%a
goto :eof
:FQ
set "c=%*"
for %%b in (&q ...

三楼的代码似乎不能用。

2008-8-22 20:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
FQ
社区乞丐





积分 -61
发帖 37
注册 2008-4-19
状态 离线
『第 7 楼』:  

我不知道怎么不能用了???

2008-8-22 21:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 8 楼』:  

回7楼,可能代码贴的有问题,能否传个附件上来,谢了!

2008-8-22 22:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 9 楼』:  

没那么麻烦呀?



知,不觉多。不知,乃求知
2008-8-22 23:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by FQ at 2008-8-22 09:06 PM:
我不知道怎么不能用了???

有些字段本来含有*号的,结果你把呆*号的字段都过滤了。比如 "SAP*" 就没了。

2008-8-22 23:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by uiopuiop at 2008-8-22 20:43:
回版主,先谢一下!
不过发现你的算法有时候会有问题,当csv 文件有几项的值为空时,就会出错:
数据会发生错位。
例如

reqwre, reqre, reqre, rewqr ...

上面的代码只是按照楼顶的要求写的,没考虑空值的情况,如果不介意的话可以试试用sed来做。
sed -r "s/^[ \t]+//;s/[ \t]+$//g;s/,[\t ]+/,/g;s/[ \t]+,/,/g" TEST.TXT
[ Last edited by lxmxn on 2008-8-23 at 01:52 AM ]

2008-8-23 01:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by lxmxn at 2008-8-23 01:33 AM:

上面的代码只是按照楼顶的要求写的,没考虑空值的情况,如果不介意的话可以试试用sed来做。
[code]sed -r "s/^[ \t]+//;s/[ \t]+$//g;s/,[\t ]+/,/g;s/[ \t]+, ...

不好意思啊,是我先前没说清楚。不过用SED的话,我早就用PERL了,目的就是用一个BAT搞定所有。另外:上面的命令输出到文件后,居然变成了UNIX的格式,DOS回车符没了。

我现在用的BAT是把所有的空行,空格和TAB都过滤掉,所以不是很理想。

[ Last edited by uiopuiop on 2008-8-23 at 01:41 PM ]

2008-8-23 12:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 13 楼』:  

VBA

Dim r As Range
For Each r In UsedRange.Cells
   r.Value = Replace(Trim(r.Value), " ", "")
Next

2008-8-23 19:12
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 14 楼』:  

csv文件用VBA方便些。

2008-8-23 19:13
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by abcd at 2008-8-23 07:13 PM:
csv文件用VBA方便些。

CSV 文件是我批处理的配置文件,批处理读取数据并执行相应操作。

2008-8-23 19:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: