批处理:将管道分隔的文本文件转换为逗号分隔的csv文件

时间:2016-05-17 10:59:49

标签: batch-file

我有一个.txt这样的文件:

Customer Number||Customer Name||Partner Number||Partner Name||Customer Country
1ABC||Jame||1234||Anny||USA
2DEF||Susan||5678||Prissy||UK

我的输出应该是.csv文件,没有空列。

这就是我的尝试:

@echo off
setlocal disableDelayedExpansion
set input="C:\a.txt"
set output="C:\Customer_Pipe.csv"
>%output% (
    for /f "tokens=*" %%a in ('input"') do (
        set line=%%a
        setlocal enableDelayedExpansion
        echo "!line:|=","!">>"%~2"
    )
)

2 个答案:

答案 0 :(得分:1)

如果您想要读取存储在变量INPUT中的文件,您需要将其读作%INPUT%才能执行此操作(您使用奇数引文明确指出INPUT)。在''集合中指定for /F时,()中的部分将被解释为命令而不是文件,因此for /F会尝试执行命令input无法找到,因此脚本失败。我强烈建议将""usebackq选项一起放在指定文件周围,以避免路径/文件名中出现空格问题。

如果您要写入存储在变量OUTPUT中的文件,则不得将echo重定向到其他位置(您在代码中放置>>"%~2")。

这是我写的代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Define constants here:
set "INPUT=%~1"
set "OUTPUT=%~2"

if not defined INPUT exit /B 1
if not defined OUTPUT set "OUTPUT=con"
> "%OUTPUT%" (
    for /F usebackq^ delims^=^ eol^= %%L in ("%INPUT%") do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        echo(!LINE:^|^|=,!
        endlocal
    )
)

endlocal
exit /B

批处理程序的输入文件必须作为第一个命令行参数提供。第二个参数(可选)是输出文件。

请注意,此脚本不会检查输入数据是否包含,个字符,这会影响转换后文件的处理方式。如果要在返回的CSV数据的所有字段周围加上引号以避免数据解释问题,请将上述echo命令行替换为:

echo("!LINE:||=","!"

输出数据(使用原始echo命令行)如下所示:

Customer Number,Customer Name,Partner Number,Partner Name,Customer Country
1ABC,Jame,1234,Anny,USA
2DEF,Susan,5678,Prissy,UK

修改后的echo命令行的输出数据如下所示:

"Customer Number","Customer Name","Partner Number","Partner Name","Customer Country"
"1ABC","Jame","1234","Anny","USA"
"2DEF","Susan","5678","Prissy","UK"

答案 1 :(得分:0)

您的代码中存在两个问题。

1)
您使用setlocal EnableDelayedExpansion,这是一个好主意,但您必须使用endlocal关闭它,否则在~32 setlocals之后会出现错误。

2)
你的替换功能看起来有点奇怪 你添加一些引号,它们将成为输出的一部分。
你可以试试这个。 echo(!line:^|^|=,!

完全

>%output% (
    for /f "tokens=*" %%a in (%input%) do (
        set "line=%%a"
        setlocal EnableDelayedExpansion
        set "line=!line:||=,!"
        (echo(!line!)
        endlocal
    )
)