中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-07 03:08
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 未结:过滤一个文件里所有字符串两头的TAB和空格? 查看 1,987 回复 15
楼 主 未结:过滤一个文件里所有字符串两头的TAB和空格? 发表于 2008-08-21 21:01 ·  新加坡 惠普HP
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
想的我头发都掉了两根,没想出来简单的方法。

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

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

test 2 , test 2 , test 3 , test 4
test 2 , test 2 , test 3 , test 4

test 2,ss , ,
test2 , test 2 , test 3 , test 4

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

[ Last edited by uiopuiop on 2008-8-25 at 10:36 PM ]
附件
TEST.TXT (1.3 KiB, 下载次数: 15)
2 发表于 2008-08-22 01:54 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
@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:=!

[ Last edited by lxmxn on 2008-8-22 at 01:57 AM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
uiopuiop +2 2008-08-22 10:41
3 发表于 2008-08-22 13:25 ·  中国 北京 联通
社区乞丐
积分 -61
发帖 37
注册 2008-04-19 17:10
18年会员
UID 116329
性别 男
状态 离线
通用性比较好,不过有一个弊病,哎

@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-08-22 23:28
4 发表于 2008-08-22 14:22 ·  中国 浙江 杭州 联通
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
直接CSV里面VBA

Dim r As Range
For Each r In UsedRange.Cells
r.Value = Trim(r.Value)
Next
5 发表于 2008-08-22 20:43 ·  美国 惠普HP
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
回版主,先谢一下!
不过发现你的算法有时候会有问题,当csv 文件有几项的值为空时,就会出错:
数据会发生错位。
例如

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

[ Last edited by uiopuiop on 2008-8-22 at 08:57 PM ]
6 发表于 2008-08-22 20:50 ·  美国 惠普HP
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
Originally posted by FQ at 2008-8-22 01:25 PM:
通用性比较好,不过有一个弊病,哎

@echo off&setlocal
for /f "tokens=*" %%a in (test.csv) do call :FQ %%a
goto :eof
:FQ
set "c=%*"
for %%b in (&q ...


三楼的代码似乎不能用。
7 发表于 2008-08-22 21:06 ·  中国 北京 顺义区 联通
社区乞丐
积分 -61
发帖 37
注册 2008-04-19 17:10
18年会员
UID 116329
性别 男
状态 离线
我不知道怎么不能用了???
8 发表于 2008-08-22 22:40 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
回7楼,可能代码贴的有问题,能否传个附件上来,谢了!
9 发表于 2008-08-22 23:13 ·  中国 广东 广州 天河区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
没那么麻烦呀?
知,不觉多。不知,乃求知
10 发表于 2008-08-22 23:19 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
Originally posted by FQ at 2008-8-22 09:06 PM:
我不知道怎么不能用了???


有些字段本来含有*号的,结果你把呆*号的字段都过滤了。比如 "SAP*" 就没了。
11 发表于 2008-08-23 01:33 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by uiopuiop at 2008-8-22 20:43:
回版主,先谢一下!
不过发现你的算法有时候会有问题,当csv 文件有几项的值为空时,就会出错:
数据会发生错位。
例如

reqwre, reqre, reqre, rewqr ...

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


[ Last edited by lxmxn on 2008-8-23 at 01:52 AM ]
12 发表于 2008-08-23 12:26 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
Originally posted by lxmxn at 2008-8-23 01:33 AM:

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



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

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

[ Last edited by uiopuiop on 2008-8-23 at 01:41 PM ]
13 发表于 2008-08-23 19:12 ·  中国 浙江 杭州 中移铁通
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
VBA

Dim r As Range
For Each r In UsedRange.Cells
r.Value = Replace(Trim(r.Value), " ", "")
Next
14 发表于 2008-08-23 19:13 ·  中国 浙江 杭州 中移铁通
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
csv文件用VBA方便些。
15 发表于 2008-08-23 19:48 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
Originally posted by abcd at 2008-8-23 07:13 PM:
csv文件用VBA方便些。


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