我需要一種方法將CSV文件中的分隔符從逗號更改爲管道。由於CSV文件的大小(〜750 Mb到幾Gb),使用Import-CSV和/或Get-Content不是一種選擇。什麼我使用(和什麼工作,儘管速度緩慢)是下面的代碼:使用Powershell更改大CSV文件中的分隔符
$reader = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser $source
$reader.SetDelimiters(",")
While(!$reader.EndOfData)
{
$line = $reader.ReadFields()
$details = [ordered]@{
"Plugin ID" = $line[0]
CVE = $line[1]
CVSS = $line[2]
Risk = $line[3]
}
$export = New-Object PSObject -Property $details
$export | Export-Csv -Append -Delimiter "|" -Force -NoTypeInformation -Path "C:\MyFolder\Delimiter Change.csv"
}
這個小環花了將近2分鐘處理20 MB的文件。以這種速度擴展將意味着我目前正在使用的最小CSV文件超過一小時。
我已經試過這還有:
While(!$reader.EndOfData)
{
$line = $reader.ReadFields()
$details = [ordered]@{
# Same data as before
}
$export.Add($details) | Out-Null
}
$export | Export-Csv -Append -Delimiter "|" -Force -NoTypeInformation -Path "C:\MyFolder\Delimiter Change.csv"
這是更快,但不提供新的CSV正確的信息。相反,我得到的這一排排:
"Count"|"IsReadOnly"|"Keys"|"Values"|"IsFixedSize"|"SyncRoot"|"IsSynchronized"
"13"|"False"|"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection"|"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection"|"False"|"System.Object"|"False"
"13"|"False"|"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection"|"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection"|"False"|"System.Object"|"False"
於是,兩個問題:
1)可以在一個代碼塊進行得更快? 2)如何在第二個示例中打開arraylist以獲取實際數據?這裏找到的樣本數據 - http://pastebin.com/6L98jGNg
CSV文件是否在數據中包含逗號?如果不是,逐行讀取文件並用管道替換逗號可能會快得多。 –
是否*刪除數據以保持帖子小*意味着您正在處理CSV以及使用管道? –
@AndrewMorton,是的。逗號和換行符。 我已經添加了幾行來看看發生了什麼。我沒有輸送任何東西,只是將CSV中的數據添加到$ details變量中。 – Tchotchke