2011-10-25 262 views
0

在格式不正確的.csv文件中,有一行數據帶有額外的雙引號,例如最後一行:如何刪除額外的雙引號?

Name,Comment 
"Peter","Nice singer" 
"Paul","Love "folk" songs" 

如何刪除雙引號folk和替換字符串:

Name,Comment 
"Peter","Nice singer" 
"Paul","Love _folk_ songs" 

回答

1
$str = '"folk"'; 

$new = str_replace('"', '', $str); 

/* now $new is only folk, without " */ 
+1

哈,哈,非常有趣:) –

+4

我不能決定我是否應該爲幽默投票,或者因爲缺少這一點而失望。 –

+0

那麼,他確實正確回答了這個問題。 –

8

在Ruby 1.9,以下工作:

result = subject.gsub(/(?<!^|,)"(?!,|$)/, '_') 

以前的版本沒有lookbehind斷言。

說明:

(?<!^|,) # Assert that we're not at the start of the line or right after a comma 
"   # Match a quote 
(?!,|$) # Assert that we're not at the end of the line or right before a comma 

當然這個假設如果你不上Ruby 1.9的,我們不會碰到病理情況下,像

"Mary",""Oh," she said" 
+0

根據他的另一個問題(http://stackoverflow.com/questions/7886051/),我會說病理案例的機會相當高。 –

+0

有沒有紅寶石1.8.7的版本?謝謝! – ohho

+0

不,因爲Ruby版本<1.9,缺少該功能。 –

2

,或者只是厭倦的正則表達式有時會在,上拆分字符串,去掉第一個/最後一個引號,用_替換剩餘的" s,重新引用並加入,

(我們不總是擔心效率!)

+0

是的,直到'「彼得,保羅和瑪麗」,「泡芙,魔龍」隨之而來:) –

+0

@TimPietzcker(是的,我有一個內部的鬥爭,試圖記住如果Ruby的CSV庫會處理這個權利,所以我終於在所有的上面加上了。) –

+1

'fastercsv'無法處理這個(至少默認設置) – ohho

0

元策略:

這可能是因爲數據是手工不一致進入的情況下,CSV的會導致混亂,當人們手動輸入無論是現場終結者(雙引號)還是分隔符(逗號)。如果您可以重新生成文件,請讓他們使用非常不可能的字段開始/結束標記,例如5代字符(~~~~~),然後您可以分割「~~~~~,~~~~~ 「並且每次都得到正確數量的字段。

0

除非您沒有其他選擇,否則通過正確轉義獲取文件重新生成。任何其他方法都是要求麻煩,因爲插入未轉義的報價是有損的,因此不能可靠地反轉。

如果你無法從源代碼獲得固定的文件,那麼Tim Pietzcker的正則表達式總比沒有好,但我強烈建議你讓腳本打印所有「固定」行並手動檢查錯誤。