我在这里找到了一个漂亮的命令- http://www.stackoverflow.com/questions/27892957/merging-multiple-csv-files-into-one-using-powershell,我用它来合并CSV文件-
Get-ChildItem -Filter *.csv | Select-Object -ExpandProperty FullName | Import-Csv | Export-Csv .mergedmerged.csv -NoTypeInformation -Append
现在这就像它在锡上说的,并且在大多数情况下工作得很好。然而,我有两个问题,我想知道是否有一种方法可以克服它们:
首先,合并的csv文件有CRLF行结尾,我想知道如何使行结尾只是LF,因为文件正在生成?
此外,看起来有一些恶作剧,引号被添加/移动。例如:
来自初始CSV的示例行:
"2021-10-05"|"00:00"|"1212"|"160477"|"1.00"|"3.49"LF
合并CSV中的同一行:
"2021-10-05|""00:00""|""1212""|""160477""|""1.00""|""3.49"""CRLF
可以看到,第一行失去了尾引号,其他字段有双引号,行尾有一个额外的引号。我不太确定这里发生了什么,所以任何帮助都会非常感激!
对于处理引号,"问题"的原因是您的CSV没有使用Import-CSV
假设的默认字段分隔符-CSV中的C代表逗号,并且您正在使用竖条。在Import-CSV
和Export-CSV
cmdlet中分别添加-Delimiter "|"
参数
我不认为你可以做任何关于行结束字符(CRLF vs LF);这几乎肯定与操作系统有关。
Jeff Zeitlin的回答很好地解释了问题中引用相关的部分。
关于你的换行问题:
-
从PowerShell 7.2开始,没有PowerShell原生特性允许您控制文件写入cmdlet(如
Export-Csv
)的换行格式。 -
然而,如果您使用纯文本处理,您可以使用用感兴趣的换行格式构建的多行字符串,并使用
Set-Content
及其-NoNewLine
开关保存/附加它们,该开关将输入字符串按原样写入,而不使用(换行)分隔符。
事实上,为了显著加快处理速度,纯文本处理更可取,因为本质上你的操作相当于连接文本文件,唯一的变化是除了第一个文件之外的所有文件的标题行都应该被跳过;使用纯文本处理也绕过了你的报价问题:
$tokenCount = 1
Get-ChildItem -Filter *.csv |
Get-Content -Raw |
ForEach-Object {
# Get the file content and replace CRLF with LF.
# Include the first line (the header) only for the first file.
$content = ($_ -split 'r?n', $tokenCount)[-1].Replace("`r`n", "`n")
$tokenCount = 2 # Subsequent files should have their header ignored.
# Make sure that each file content ends in a LF
if (-not $content.EndsWith("`n")) { $content += "`n" }
# Output the modified content.
$content
} |
Set-Content -NoNewLine ./merged/merged.csv # add -Encoding as needed.