0

MYSQL から CSV ファイルにデータをエクスポートするスクリプトがあります。データは数値、テキスト、および特殊文字です。すべてのフィールドは二重引用符で区切られ、コンマで区切られます。

次の形式でデータをエクスポートする必要があります。

「これは (x2") ひどく文法化された文です。はい、「いいえ」、おそらく & もっと」、「0043」、「false」など..

ただし、各フィールドに htmlsepcialchars を適用する場合にのみ動作させることができます。データは上記のままにしておく必要がありますが、Excel や Calc に入ると、コンマや一重引用符などでデータが台無しになります。文の一部が 1 つのセルにあり、別のセルにあることを意味します。

$dataResult = mysql_query("SELECT * FROM data");

while ($rowData = mysql_fetch_row($dataResult)) 
{
    for ($j=0;$j<32;$j++) 
    {
        $csv_output .= '"'.htmlspecialchars($rowData[$j]).'",';
    }

$csv_output .= "\n";

}

4

3 に答える 3

1

組み込みfputcsv関数は、有効な csv を出力するために必要なすべてを処理します。残念ながら、ファイルにしか出力できませんが、コメントに回避策があります。Guileの功績は次のとおりです。

<?php
function outputCSV($data) {

    $outstream = fopen("php://output", 'w');

    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals, ';', '"');
    }
    array_walk($data, '__outputCSV', $outstream);

    fclose($outstream);
}

$mydata = array(
 array('data11', 'data12', 'data13'),
 array('data21', 'data22', 'data23'),
 array('data31', 'data32', 'data23'));

outputCSV($mydata);
/* Output sent :
data11;data12;data13
data21;data22;data23
data31;data32;data23
*/
于 2011-04-16T16:31:42.140 に答える
1

htmlspecialchars は、(関数名が示すように) HTML に挿入されたデータをエスケープすることのみを目的としています。CSV データの場合、特に 1 つではなく 2 つの引用符を使用して、CSV 標準に準拠した関数を作成することを検討してください。

例えば:

function csvspecialchars($msg) {
  return str_replace('"', '""', $msg);
}

逃げる他のキャラクターもいるかもしれません。RFC 4180で標準を確認してください。

于 2011-04-16T16:26:18.700 に答える
1

wikipediaによると、二重引用符を二重にすることで二重引用符をエスケープできます (例: "this is a (x2"") badly grammorize'd sentence. Yes, ""no"", maybe & more.","0043","false")。これでコンマの問題も解決するはずです。一重引用符が問題になる理由はわかりません...

于 2011-04-16T16:26:56.137 に答える