我原本打算使用PowerShell中的FOR命令来转换文件,但是使用命令行直接使用参数解析文件会更加容易和简单。请注意保留HTML标签。
@echo off rem findstr "@SPC@" sample3.csv&& echo ERROR: source has our space encoding& goto :EOF
for /F "tokens=*" %%a in (sample3.csv) do (
set x_line=%%a
set x_line=!x_line: =@SPC@!
set x_line=!x_line:^&=@AND@!
set x_line=!x_line:^|=@POR@!
call :parcsv %%a& rem dangerous unless you parsed properly
)
goto :EOF
:parcsv
set x_cola=%~1
set x_colb=%~2
set x_colc=%~3
set x_cold=%~4
for %%v in ( x_cola x_colb x_colc x_cold
) do set %%v=!%%v:@POR@=^|!& set %%v=!%%v:@AND@=^&! set %%v=!%%v:@SPC@= !
echo "!x_cola!" "!x_colb!" "!x_colc!" "!x_cold!"
goto :EOF
这将正确处理一行为1,2,"苹果,香蕉",4的文件。
或者用于将逗号分隔文件转换为制表符分隔等。
但是经过第二次思考,它现在会中断:1,2,"橙色香蕉",5点半,6
所以我需要更新原始的FOR /F行:for /F "tokens=* delims=," %%a in (sample.csv) do call :parcsv %%a,使其使用替代字符或代码而不是空格。
再次审查后,如果在一行中有"&",它实际上非常糟糕,因为您可能会打破批处理文件并被黑客攻击...因此我们需要对"&"和"|"进行编码,以及可能还有更多!!! 因此,让我们更新这些内容...
因此,也许PowerShell混合一行脚本并不那么糟糕:
for /F "tokens=1-4 delims= " %%a in ('powershell "import-csv sample.csv|convertto-csv -d `t"') do echo a:[%%a] b:[%%b] c:[%%c] d:[%%d]
Import-Csv
是内置的。 - Bill_Stewart