使用批处理从逗号分隔的csv文件中删除最后一列的空格

时间:2016-04-22 13:40:54

标签: csv batch-file

此脚本从所有列中删除空间

Setlocal enabledelayedexpansion
Set in=f1.csv
Set out=f2.csv
For /f "tokens=* delims=," %%A in ('type %in%') do set line=%%A
>>%out% echo !line: =!
)

输入:" a,b c d,e" 实际:",BCD,E" 预期:" a,b c d,e"

我想仅从最后一列中删除空格。

3 个答案:

答案 0 :(得分:1)

!line: =!删除!line!变量中的所有空格,这就是您最终使用a,bcd,e的原因。

如果您只想从整行中删除单个尾随空格,您可以这样做:

>>%out% echo !line:~0,-1!

如果您想删除某些列中的空格并在其他列中留空格,您必须单独处理每个空格。

For /f "tokens=1-3 delims=," %%A in ('type %in%') do (
    set "colA=%%A"
    set "colB=%%B"
    set "colC=%%C"
    >>%out% echo !colA!,!colB!,!colC: =!
)

但是,这仍将从最后一列中删除所有空格。

答案 1 :(得分:1)

而不是

>>%out% echo !line: =!

插入这些行:

if "!line:~-1"==" " set "line=!line:~0,-1"
>>%out% echo !line!

(如果最后一个字符是空格,则删除最后一个字符)

答案 2 :(得分:1)

这是另一个解决方案。它应该与具有未知列数的CSV文件一起使用(原样最多20个,但您可以增加for /L循环中的数量,但代价是效率稍高)。在设置变量时我使用了一堆call语句,以避免在列值中压缩感叹号。

@echo off & setlocal

rem // redirect output to new csv file
>"new.csv" (

    rem // get each line from the old csv file
    for /f "usebackq delims=" %%I in ("test.csv") do (
        set "line=%%I"

        rem // get the last column (max 20 columns)
        call set "last=%%line:*,=%%"
        for /L %%# in (1,1,19) do call set "last=%%last:*,=%%"

        rem // remove spaces in last column and reassemble line
        call call set "line=%%%%line:%%last%%=%%last: =%%%%%%"

        rem // output result
        setlocal enabledelayedexpansion
        echo(!line!
        endlocal
    )
)

请注意,如果最右边的CSV列包含带引号的逗号,或者另一列的值与最后一列的值相同,则会产生不正确的结果。

解决@RB's comment:CSV文件中没有标题行使得使用PowerShell进行解析比预期的要复杂一些。不过,它仍然比试图分裂逗号更安全。这是一个演示的批处理+ PowerShell混合脚本。

<# : batch portion
@echo off & setlocal

set "csvfile=test.csv"
>"new.csv" powershell -noprofile "iex (${%~f0} | out-string)"

goto :EOF
: end batch / begin PowerShell hybrid code #>

# because csv is headerless, specify generic header row (max 20 cols)
$csv = import-csv $env:csvfile -header (1..20)

# check which columns have data
$cols = $csv | gm | ?{
    $_.MemberType -eq 'NoteProperty' -and $_.Definition -match '^string'
} | %{ $_.Name }

# for each row...
for ($i=0; $i -lt $csv.length; $i++) {

    # copy meaningful column values into temporary array
    $output = @()
    foreach ($col in $cols) { $output += $csv[$i].$col }

    # replace spaces in the last element
    $output[$output.length-1] = $output[$output.length-1] -replace " "

    # output the result
    $output -join ","
}