-1

希望这是一个简单的答案。基本上我希望能够获取我们将称为 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
4

1 回答 1

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 参数的额外引用是为了处理文件名中有空格的情况。如果它包含一个空格并且您不引用它,则文件名的各个部分将被视为单独的参数。我想你可以在这种情况下使用 %* ,但我更喜欢引用一些东西来明确我希望将数据视为一个单元。

于 2013-06-22T05:26:12.117 回答