2016-03-13 27 views
3

我使用ConvertTo-Csv cmdlet導出了製表符分隔的csv文件。導出時,它將每個字段用引號引起來。我試圖刪除這些引號(我不想刪除字段中的那些引號)。我試過這個,但沒有奏效。替換ConvertTo-Csv cmdlet生成的字段周圍的引號

(Get-Content $root\$filename) | % {$_ -replace('"`t"', "`t")} | Set-Content $root\$filename 

值被打印出來像這樣由標籤分隔的「MASSP」。如果是「M」 ASSP」我想刪除在外面的雙引號,並保存一個字母后,‘M’

+2

沒有工作怎麼樣?是否錯過了第一個報價,傳遞錯誤,還是不能替換它們中的任何一個? – JGreenwell

+0

該文件是用引號仍然圍繞字段和字段名稱生成的。 –

+0

我認爲你的意思是''M「」ASSP「',而不是''M」ASSP「'''ConvertTo-Csv'用'''''將_embedded_雙引號轉義。 – mklement0

回答

4

嘗試以下操作:

(Get-Content $root\$filename) | 
    % { ($_ -replace '^"|"$|(?<=\t)"|"(?=\t)', '') -replace '""', '"' } | 
    Set-Content $root\$filename 

- 中雖然​​問題發生在語法上工作,它表明你誤以爲-replace需要調用方法的語法;然而,-replace操作
- 裏面的正則表達式的說法,因爲y您正在使用單引號字符串,正則表達式應用了轉義規則,因此選項卡必須表示爲\t
- 不像我原以爲,它可以讀取和寫入到一個管道中的同一個文件,這表現在OP自己和在評論由Frode F.指出:括號封閉Get-Content $root\$filename確保整個文件被讀取前面立即關閉,允許Set-Content覆蓋它。

該方法使用2次:

  • 在第一遍中,所有現場開始和現場結束雙引號被除去。
    • ^"相匹配的第一個領域的開放"
    • (?<=\t)"任何領域,但1日開幕"匹配。
    • "(?=\t)匹配任何字段的最後一個報價。
    • "$匹配最後一個字段的結尾"
  • 在第二遍中,所有現場內部雙引號 - 這是一倍通過ConvertTo-Csv - 被替換爲單個實例。
+0

謝謝mklement0您的解決方案工作!我從你們這裏學到了很多東西。 –

+2

'(Get-Content file.txt)| %{$ _} | Set-Content file.txt'起作用。在'Get-Content'周圍使用子/組表達式,這樣它會在將整個文件發送到管道之前讀取整個文件。 –

+0

@FrodeF .:謝謝,我錯過了 - 這是一個方便的技巧(雖然不適合大文件);答案已更新。 – mklement0