2015-07-10 16 views
0

例如,以下csv文件。如何用「;」全局替換「,」在CSV文件?

123,"a,b,c",456 

將成爲

123,"a;b;c",456 

下面的代碼生成一個空文件(test.txt的)和它的速度慢。

Import-Csv file.csv | % { 
    $r = @{} 
    foreach($v in $_.PSObject.Properties) { 
     if ($v.Value -like "*,*") { 
      $r | Add-Member -MemberType NoteProperty -Name $v.Name -Value ($v.Value -replace ",",";") 
     } 
     else { 
      $r | Add-Member -MemberType NoteProperty -Name $v.Name -Value ($v.Value) 
     } 
    } 
} | Export-Csv test.txt 

回答

1

你可以簡化你的代碼是這樣的:

$csv = Import-Csv 'C:\path\to\file.csv' 

$properties = $csv[0].PSObject.Properties.Name 

$csv | % { 
    foreach ($p in $properties) { 
    $_.$p = $_.$p -replace ',', ';' 
    } 
    $_ # "passthru" 
} | Export-Csv 'C:\path\to\test.txt' -NoType 

,用於評估屬性名稱只有一次,也避免了創建新的對象,並增加新的成員對他們所有的時間。

+0

處理3MB文件需要23分鐘。 – ca9163d9

+0

@ dc7a9163d9在我的測試虛擬機上使用一個(不可否認的是簡單的)4 MB樣本文件進行測試運行需要1秒多一點時間。 –

+0

我在共享驅動器上測試過。共享驅動器的慢度導致性能問題。 – ca9163d9

1

正則表達式。

關於不屬於最初交易的一部分的可能性與@ dc7a9163d9一點意見戰爭結束後,下面的代碼做了兩兩件事:

一)替換逗號(,)用分號(;)CSV領域內。

b)在CSV字段中用單引號(')替換雙引號(「」)對。

$cRows = Get-Content -Path "file.csv" 
$cNewRows = @() 
foreach ($sRow in $cRows) { 
    $sRow = $sRow ` 
     -replace '(?:(?<!^|,|[^"]"|"{3})),(?:(?!"[^"]|"{3}|$))', ';' ` 
     -replace '(?:(?<!^|[,]+))""', "'" -replace '""', "'" 
    $cNewRows += $sRow 
} 

$cNewRows | Out-File -FilePath "test.txt" 
+0

但是,當逗號周圍有雙引號時,RE不起作用。 「123,」a「」,「b,c」,456「替換」(?:(?<!「)),(?:(?!」))',';'' – ca9163d9

+0

heh。更新了我的答案。 –

+0

如果我想用''替換'''''''''? – ca9163d9