Board logo

标题: 未结:过滤一个文件里所有字符串两头的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 ]