标题: 未结:过滤一个文件里所有字符串两头的TAB和空格?
[打印本页]
作者: uiopuiop
时间: 2008-8-21 21:01
标题: 未结:过滤一个文件里所有字符串两头的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)
作者: lxmxn
时间: 2008-8-22 01:54
@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 ]
作者: FQ
时间: 2008-8-22 13:25
通用性比较好,不过有一个弊病,哎
@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=%*,
作者: abcd
时间: 2008-8-22 14:22
直接CSV里面VBA
Dim r As Range
For Each r In UsedRange.Cells
r.Value = Trim(r.Value)
Next
作者: uiopuiop
时间: 2008-8-22 20:43
回版主,先谢一下!
不过发现你的算法有时候会有问题,当csv 文件有几项的值为空时,就会出错:
数据会发生错位。
例如
reqwre, reqre, reqre, rewqre
rere, , ,
tt, tt,
add,ddsa,fdaf,dfafd
[
Last edited by uiopuiop on 2008-8-22 at 08:57 PM ]
作者: uiopuiop
时间: 2008-8-22 20:50
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 ... |
|
三楼的代码似乎不能用。
作者: FQ
时间: 2008-8-22 21:06
我不知道怎么不能用了???
作者: uiopuiop
时间: 2008-8-22 22:40
回7楼,可能代码贴的有问题,能否传个附件上来,谢了!
作者: flyinspace
时间: 2008-8-22 23:13
没那么麻烦呀?
作者: uiopuiop
时间: 2008-8-22 23:19
Quote: |
Originally posted by FQ at 2008-8-22 09:06 PM:
我不知道怎么不能用了??? |
|
有些字段本来含有*号的,结果你把呆*号的字段都过滤了。比如 "SAP*" 就没了。
作者: lxmxn
时间: 2008-8-23 01:33
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 ]
作者: uiopuiop
时间: 2008-8-23 12:26
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 ]
作者: abcd
时间: 2008-8-23 19:12
VBA
Dim r As Range
For Each r In UsedRange.Cells
r.Value = Replace(Trim(r.Value), " ", "")
Next
作者: abcd
时间: 2008-8-23 19:13
csv文件用VBA方便些。
作者: uiopuiop
时间: 2008-8-23 19:48
Quote: |
Originally posted by abcd at 2008-8-23 07:13 PM:
csv文件用VBA方便些。 |
|
CSV 文件是我批处理的配置文件,批处理读取数据并执行相应操作。
作者: netbenton
时间: 2009-1-28 02:27
标题: 我也学会了,^_^
谢谢版主,我也学会了,稍作了下改动,使之不会丢掉前三列后面的空格
而且精简了
第一个for 丢弃[tab]
第二个for 丢掉前空格和后空格
@echo off
cd.>test1.txt
for /f "tokens=1-6 delims= " %%a in (test.txt) do (
for /f "tokens=*" %%g in ("%%a%%b%%c%%d%%e%%f") do (
echo/%%~nxg>>test1.txt
)
)
type test1.txt
pause
goto :eof
[
Last edited by netbenton on 2009-1-28 at 02:42 ]