此脚本从所有列中删除空间
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"
我想仅从最后一列中删除空格。
答案 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 ","
}