我有一个.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"
)
)
答案 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
)
)