在格式不正確的.csv文件中,有一行數據帶有額外的雙引號,例如最後一行:如何刪除額外的雙引號?
Name,Comment
"Peter","Nice singer"
"Paul","Love "folk" songs"
如何刪除雙引號folk
和替換字符串:
Name,Comment
"Peter","Nice singer"
"Paul","Love _folk_ songs"
在格式不正確的.csv文件中,有一行數據帶有額外的雙引號,例如最後一行:如何刪除額外的雙引號?
Name,Comment
"Peter","Nice singer"
"Paul","Love "folk" songs"
如何刪除雙引號folk
和替換字符串:
Name,Comment
"Peter","Nice singer"
"Paul","Love _folk_ songs"
$str = '"folk"';
$new = str_replace('"', '', $str);
/* now $new is only folk, without " */
在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"
根據他的另一個問題(http://stackoverflow.com/questions/7886051/),我會說病理案例的機會相當高。 –
有沒有紅寶石1.8.7的版本?謝謝! – ohho
不,因爲Ruby版本<1.9,缺少該功能。 –
,或者只是厭倦的正則表達式有時會在,
上拆分字符串,去掉第一個/最後一個引號,用_
替換剩餘的"
s,重新引用並加入,
。
(我們不總是擔心效率!)
是的,直到'「彼得,保羅和瑪麗」,「泡芙,魔龍」隨之而來:) –
@TimPietzcker(是的,我有一個內部的鬥爭,試圖記住如果Ruby的CSV庫會處理這個權利,所以我終於在所有的上面加上了。) –
'fastercsv'無法處理這個(至少默認設置) – ohho
元策略:
這可能是因爲數據是手工不一致進入的情況下,CSV的會導致混亂,當人們手動輸入無論是現場終結者(雙引號)還是分隔符(逗號)。如果您可以重新生成文件,請讓他們使用非常不可能的字段開始/結束標記,例如5代字符(~~~~~),然後您可以分割「~~~~~,~~~~~ 「並且每次都得到正確數量的字段。
除非您沒有其他選擇,否則通過正確轉義獲取文件重新生成。任何其他方法都是要求麻煩,因爲插入未轉義的報價是有損的,因此不能可靠地反轉。
如果你無法從源代碼獲得固定的文件,那麼Tim Pietzcker的正則表達式總比沒有好,但我強烈建議你讓腳本打印所有「固定」行並手動檢查錯誤。
哈,哈,非常有趣:) –
我不能決定我是否應該爲幽默投票,或者因爲缺少這一點而失望。 –
那麼,他確實正確回答了這個問題。 –