2017-07-10 68 views
-1

我正在使用以下代碼導入和導出爲CSV。我之所以進行導出是因爲我需要將導出的CSV中的所有列都用雙引號括起來。但是在下面的代碼中,雙引號只出現在每一行的第一個和最後一個。使用PowerShell導入和導出CSV以及雙引號中的所有列

Import-Csv c:\Emp.csv | Export-Csv c:\Emp1.csv -NoTypeInformation -Force 

請注意,我已經嘗試下面的代碼(即工作,但需要更長的時間,如果CSV的大小是> 200MB):

$inform = Get-Content C:\A.csv 
$inform | % { 
    $info = $_.ToString().Replace("|", """|""") 
    $info += """" 
    $var = """" + $info 
    $var | Out-File D:\B.csv -Append 
} 

樣品輸入(CSV文件):

 
1|A|Test|ABC,PQR 

樣本輸出(CSV文件):

 
"1"|"A"|"Test"|"ABC,PQR" 
+0

請發佈示例輸入,並輸出每段代碼。這個要求的原因是什麼? AFAIK PowerShell遵循[IETF標準](https://tools.ietf.org/html/rfc4180),因此只有在需要時纔會用引號引起來(即值有特殊字符)。 – gms0ulman

+0

它實際上把整行放在雙引號如下 ''1 | A | Test | ABC,PQR'' – Joseph

+6

'Export-Csv'已經做到了你想要的,但是你正在使用自定義分隔符('| | '),所以你需要將'Import-Csv'和'Export-Csv'指定爲'-Delimiter'|''。 –

回答

1

Export-Csv已經通過自身增加了圍繞每場雙引號,因此,所有你需要的是做的就是讓它使用正確的分隔符:

Import-Csv 'C:\path\to\input.csv' -Delimiter '|' | 
    Export-Csv 'C:\path\to\output.csv' -Delimiter '|' -NoType 

然而,Export-Csv增加了周圍的所有領域引號亂射,所以如果你想以選擇性地添加特定字段周圍的引號,您將需要一個自定義例程:

$reader = New-Object IO.StreamReader 'C:\path\to\input.csv' 
$writer = New-Object IO.StreamWriter 'C:\path\to\output.csv' 

while ($reader.Peek() -ge 0) { 
    $line = $reader.ReadLine().Split('|') 
    for ($i=0; $i -lt $line.Count; $i++) { 
     if ($line[$i] -like '*,*') { 
      $line[$i] = '"{0}"' -f $line[$i] 
     } 
    } 
    $writer.WriteLine(($line -join '|')) 
} 

$reader.Close(); $reader.Dispose() 
$writer.Close(); $writer.Dispose()