2014-04-01 22 views
4

我有一個包含CSV文件內容的大字符串。到目前爲止,我並不在意解析它,因爲我的程序只是將它從一個源碼流到另一個源碼。從CSV數據字符串中刪除換行符(PHP 5.3之前版本)

如果您決定接受它,您的任務是告訴我從包含多個CSV數據行的字符串的數據元素中刪除換行符的最佳方式,而不會丟棄分隔行本身的換行符。該數據被正確引用,並且該實現必須在PHP 5.2運行......

id,data,other 
1,"This is data 
with a line break I want replacing",1 
2,"This is a line with no line break in the data",0 
3,No quotes,42 
4,"Quoted field with ""quotes inside"" which is tricky",84 
+0

你能否詳細說明'不扔掉線breaks'刪除換行符?在我看來,數據和預期結果的例子也會改善你的問題。 –

+0

每行是否包含固定數量的字段,我的意思是您需要一些信息來表示單行。例如。每5個逗號我們有一條線。 – Melsi

+0

所有CSV數據都包含固定數量的字段。 :-)。 @AndriusNaruševičius示例添加了 – vogomatix

回答

1

我想,如果有CSV數據內換行,必須有引號的奇(未成)號在那條線上。如果有這樣一條線,請刪除它的換行符並檢查新創建的線是否有效。 下面的僞PHP代碼應該可以工作。東西線ReadercontainsOddNumberOfQuotes()很容易實現在PHP 5.2:

function fixCsv($fileOrString) { 
    $reader = new Reader($fileOrString); 
    $correctCsv = ""; 
    while ($reader->hasMoreLines()) { 
     $correctCsv = $correctCsv . fixLine($reader, $reader->readLine()) . "\n"; 
    } 
    return $correctCsv; 
} 

/** Recursive function that returns a valid CSV line. */ 
function fixLine($reader, $line) { 
    if (containsOddNumberOfQuotes($line)) { 
     if ($reader->hasMoreLines()) { 
      // Try to make a valid CSV line by joining this line with the next one. 
      return fixLine($reader, line . $reader->readLine()) 
     } 
     throw new Exception("Last line is incomplete."); 
    } 
    else { 
     return $line; 
    } 
}