|
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 ]
|
|
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=%*,
|
|
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 |
|
|
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
状态 离线
|
|
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 |
|
|
abcd
银牌会员
积分 1436
发帖 739
注册 2007-10-11
状态 离线
|
|
2008-8-23 19:13 |
|
|
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 |
|