.txt文件数据分为2列csv文件批处理文件

时间:2013-06-20 17:42:12

标签: csv input batch-file

希望这是一个简单的答案。基本上我希望能够获得我们称之为FileSample.txt的多行文本文件的内容。它可能包含

的内容
Some text sample1 : Extra1  
Some text sample2 : Extra2        
Some text sample3 : Extra3  
Some text sample4 : Extra4  

并且基本上将其输入到2列csv中,我们将调用Output.csv。第一列应该是文件名,第二列应该包含文本文件的内容(包括硬返回)。所以基本上csv应该包含这个......

FileName,Contents  
FileSample.txt,"Some text sample1 : Extra1 Some text sample2 : Extra2 Some text sample3 : Extra3  Some text sample4 : Extra4"  

我为这里的完全混乱以及完全禁止编写脚本的技巧而道歉。我真的想要完成这个,所以我用powershell做了一个解决方案。

$Content = Get-Content .\FileSample.txt 
$FileName = Get-ChildItem .\FileSample.txt

New-Object PSObject -Property @{
    FileName  = $FileName.Name
    Content = "$Content"
} | Export-Csv .\Output.csv -NoTypeInformation

尽管我不想偏离我通过批处理文件完成此操作的初始请求,但我确实设法从下面的vbscript中获得相同的结果,而不必使用保存的文件ExifTool。

Dim WshShell, oExec
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("%comspec% /c ""D:\EXIFTOOL\exiftool.exe"" test.jpg")
x1 = oExec.StdOut.ReadAll
x2 = Replace(x1, chr(34), chr(34) & chr(34))

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLogFile = objFSO.CreateTextFile("D:\EXIFTOOL\Output.csv", 1, False)

objLogFile.Write "Filename,"
objLogFile.Write "ExifData"
objLogFile.Writeline
objLogFile.Write chr(34) & "sample6.csv" & chr(34) & ","
objLogFile.Write chr(34) & x2 & chr(34)
objLogFile.Writeline
objLogFile.Close

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

@ECHO FileName,Contents

SET FILE=FileSample.txt

SET FIRST=^"%FILE%^",^"
FOR /F "tokens=*" %%l IN (%FILE%) DO @((SET LINE=%%l) & (@ECHO !FIRST!!LINE:^"=^"^"!) & (SET FIRST=))
@ECHO ^"

这回显文件名,逗号,双引号,然后文件的每一行(双引号"转义"用双引号替换它们 - 如果数据在该文件中可能有双引号),然后是(结束)双引号。

我看到的一个限制是,如果文件没有以换行结束,则结束双引号将有效地添加一个。如果文件以换行符结束,则FOR循环不会处理该空行,并且输出将是正确的。克服该限制可能意味着手动计算行数(在行上迭代的附加循环)并添加额外的变量并检查FOR循环。除非你真的想要,否则让我思考得太乱了,真的想要这种行为。 (在某些时候,批处理/ CMD中做某事的负担比依赖PowerShell,VBScript或其他一些真正的编程语言更糟糕,以完成简单事情。)

如果您打算处理多个文件,可以将最后三行放在"子程序" (我更喜欢创建嵌套的FOR循环)并在FOR循环中调用它来迭代有问题的文件。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

@ECHO FileName,Contents

FOR %%f IN (FileSample*.txt) DO CALL :PROCESS_FILE "%%~f"

GOTO :EOF

:PROCESS_FILE
SET "FILE=%~1"

SET FIRST=^"%FILE%^",^"
FOR /F "tokens=*" %%l IN (%FILE%) DO @((SET LINE=%%l) & (@ECHO !FIRST!!LINE:^"=^"^"!) & (SET FIRST=))
@ECHO ^"
EXIT /B

额外引用的参数:PROCESS_FILE用于处理文件名中有空格的情况。如果它包含空格而您没有引用它,则文件名的各个部分将被视为单独的参数。我想你可以在这种情况下使用%*,但我更喜欢引用一些东西来说明我希望将数据视为一个单元。