我在這里找到了一個漂亮的命令 - 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 .\merged\merged.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
所以看到第一行失去了它的尾隨引號,其他欄位有雙引號,行尾有一個額外的引號。我不太確定這里發生了什么,所以任何幫助將不勝感激!
uj5u.com熱心網友回復:
對于處理的報價,“問題”的原因是您的CSV不使用默認的欄位分隔符是Import-CSV假設-在?在CSV代表逗號,你正在使用的豎杠。將引數添加-Delimiter "|"到Import-CSV和Export-CSVcmdlet。
我認為您對行尾字符(CRLF 與 LF)無能為力;這幾乎可以肯定取決于作業系統。
uj5u.com熱心網友回復:
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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342621.html
下一篇:將標題添加到新的CSV檔案
