2016-05-17 75 views
0

我有一个.txt文件是这样的:批次:转换管分隔的文本文件,以逗号分隔的CSV文件

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

@RB。我需要写一个批处理文件。要做到这一点 –

+3

好的。什么阻止你这样做? (请注意,StackOverflow不是一个代码编写服务,我们可以帮助您解决所面临的特定问题,但不会为您编写代码) –

回答

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 

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

请注意,此脚本不检查输入数据是否包含,字符,这会影响转换文件的处理方式。

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

的输出数据(与原echo命令行)看起来是这样的:如果你想要把周围返回的CSV数据,以避免数据解释烦恼的各个领域引号,以取代上述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" 
+0

它完全按照我希望的那样工作@aschipfl –

+0

我是新来的stackoverflow,我没有足够的声誉做它..对不起..是否有任何方法来删除文本文件中的所有空白,然后将其转换为csv在同一批次你帮我.. @aschipfl –

+0

接受(勾选绿色复选标记)总是可能的,独立于声誉状态。要删除空格,你可以在'echo'命令行之前插入'set“LINE =!LINE:=!”';要删除标签,只需添加另一行(当然,用空格替换空格);你可以用任何角色来做到这一点;实际上这是用'='(这里什么都没有)之后的字符串替换':'和'='(这里是一个_space_)之间的给定字符串(另请参阅'set /?')... – aschipfl

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 
    ) 
) 
+0

它可以工作,但csv文件包含指定为输入(C:\ a.txt)的路径,而不是文本文件中的数据。 @jeb –

+0

@ Gowtham.S,只有当'%INPUT%'包含一个包含在''“''中的文件路径时,才会发生这种情况... – aschipfl

相关问题