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



希望这是一个简单的答案。基本上,我希望能够获得一个多行文本文件的内容,我们称之为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:EXIFTOOLexiftool.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:EXIFTOOLOutput.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
@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参数的额外引用是为了处理文件名中有空格的情况。如果文件名中包含空格而您没有引用,则文件名的各个部分将被视为单独的参数。我想在这种情况下你可以使用%*,但我更喜欢引用一些东西来表明我希望数据被视为一个单位。

相关内容

  • 没有找到相关文章

最新更新