2012-01-27 7 views
1

を引用符でカンマを削除する私は、CSVファイルを持って、私たちは、私はファイルを持っているエクセルは、例えば、二重引用符で囲むことにより、フィールドにカンマでそのことをし知っCSVは、正規表現

Product Name,Product Code 
Product 1,AAA 
"Prod,A,B",BBB 

どのようにすることができますRegExpを使って引用符を "。"で置き換えます私は、出力

+1

をなぜあなたはこれを実行する必要がありますか? PHPのCSV処理関数は、オプションで引用符で囲まれたフィールドを扱うことができます。 –

+0

これについて読んでください - > http://php.net/manual/en/function.preg-replace.php – Tudor

+0

私はテキストBLOBフィールドに変換されたデータベースから私のCSVを直接読みましたが、ディスクに書きたくないです。 – Akshat

答えて

5

CSV処理関数(fgetcsv()fputcsv())は、このために非常に優れている - 彼らはエッジケースを処理すると、おそらくはるかに信頼性の高い、あなたが思い付くことができます任意の正規表現よりもなります。ディスクへの書き込み/からの読み取りを望んでいないについてコメント続き

// Open the file 
$fp = fopen($pathToCsvFile, 'r+'); 

// Create an array of modified data 
$tmp = array(); 
while (($row = fgetcsv($fp, 8192)) !== FALSE) { 
    foreach ($row as &$field) $field = str_replace(',', '.', $field); 
    $tmp[] = $row; 
} 

// Truncate the file and put the pointer at the beginning 
ftruncate($fp, 0); 
rewind($fp); 

// Write the modified data back and close the file 
foreach ($tmp as $row) { 
    fputcsv($fp, $row); 
} 
fclose($fp); 

EDIT、あなたがこれを行うことができます:

// Lets say the raw CSV data is held in this variable as a string 
$rawCsvData = 'Product Name,Product Code 
Product 1,AAA 
"Prod,A,B",BBB'; 

// Open a virtual file pointer to memory and fill it with your data 
$fp = fopen('php://memory', 'w+'); 
fwrite($fp, $rawCsvData); 

// Start from the beginning of the pointer 
rewind($fp); 

// ... INSERT CODE FROM ABOVE HERE (minus the fopen()/fclose()) 

$modifiedCsvData = stream_get_contents($fp); 
fclose($fp); 
2

として

Product Name,Product Code 
Product 1,AAA 
Prod.A.B,BBB 

を得るように、代わりにだけ引用符これは、複数の置き換えを行うには、引用符を削除します。

<?php 
$data = 'Product Name,Product Code 
Product 1,AAA 
"Prod,A,B",BBB'; 

$rgx = '/"(.+?)"/'; 

preg_match_all($rgx, $data, $matches); 
$x = 0; $max = count($matches[0]); 
while($x < $max){ 
    $replace = str_replace(",", ".", $matches[1][$x]); 
    $data = str_replace($matches[0][$x], $replace, $data); 
    $x++; 
} 
echo $data; 
?> 
+0

素晴らしい作品です!このページの何も動作しない場合、あなたのファイルが正しいエンコーディングを持っているかどうかを確認してください。 – Akshat

+0

@Akshat Worksは素晴らしいです - 値にも二重引用符が含まれるまで。正規表現はエスケープを考慮していないので、その後、それは壊れます。これが、CSV処理機能がこれを行う方法である理由です。あなたが行うことができるようなものは、そうでないようなエッジケースを処理するものではありません。 – DaveRandom