2

DBから取得している配列があります。このプロジェクトでは、配列を csv ファイルに変換しています。しかし、ファイルを開くたびに、二重引用符が表示されます。str_replace と preg_place を試してみましたが、成功しませんでした。引用符を削除するにはどうすればよいですか

これは私のcsvコードです

$query = "SELECT t.transactiontime, t.restaurant_id, t.transactionid, t.cardid, emd.m_field_id_2, t.pricebefordiscount, t.menucard_cut
from transactions as t
left join exp_member_data AS emd ON (t.cardid-10000000 = emd.member_id) order by t.transactiontime desc limit 50";

$transactions_query = ee()->db->query($query);
$transactions_result = $transactions_query->result_array();

$transaction_array = array();
foreach ($transactions_result as $key) 
{
  $date = new DateTime($key['transactiontime']);
  $newdate = $date->format('d.m.Y');


 $transaction_array[] = array(
    'transactiontime' => $newdate,
    'restaurant_id' =>  $key['restaurant_id'], 
    'member' => $key['transactionid'] . " " . $key['m_field_id_2'],
    'pricebefordiscount' => $key['pricebefordiscount']/100,
    'menucard_cut' => $key['menucard_cut']
    ); 


}


function outputCSV($data) 
    {

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



function __outputCSV(&$vals, $key, $filehandler) 
{
    fputcsv($filehandler, $vals, ';');
}

array_walk($data, '__outputCSV', $outstream);

fclose($outstream);
}

outputCSV($transaction_array);

私の出力

19.08.2013;47657;"12459 Abdullahi";60;
19.08.2013;47658;"12455 atima";30;
4

4 に答える 4

2

引用符に間違いはありません。一部の CSV で空白を区切り文字として使用する場合に発生する可能性のある混乱を回避します。

data    "some more"    another thing
//is not the same as:
data    some more    another thing

ただし、それらを削除する場合は、次の正規表現を各行に適用します。

$line = preg_replace('/(^|;)"([^"]+)";/','$1$2;',$line);

そして、あなたは大丈夫なはずです。
それはどのように機能しますか:

  • (^|;)行頭またはセミコロンのいずれかに一致 (およびキャプチャ)
  • "リテラルに一致します"(キャプチャしません)
  • ([^" ]+): 一致しない少なくとも 1 つの文字に一致し、キャプチャします。 "
  • ";: リテラルに一致 (キャプチャなし)"および;
  • $1$2;: the$1は最初に一致したグループへの後方参照です ( )(^|;)参照、theは単なるリテラルです
    $2([^";]+);

が であるとする$line'19.08.2013;47657;"12459 Abdullahi";60;'、結果 (preg_replace呼び出し後) は次のようになります'19.08.2013;47657;12459 Abdullahi;60;'。引用符はなくなりました。

ただし、一部のフィールドに"char が含まれている場合は、おそらくエスケープされる ( \") ため、正規表現がそれを検出できないのを防ぐために、先読みアサーションを使用するものを次に示します。

$line = preg_replace('/(?<=^|;)"(.+)"(?=;)/','$1',$line);

違い:

  • (?<=^|;)非キャプチャーの肯定的な後読み。^パターン内の次のものは、文字列の先頭 ( ) またはセミコロンが前にある場合にのみ一致します。
  • (.+)現在は2番目のグループです。以下を含むすべてに一致します"
  • "(?=;)"これは、a が続く場合にのみa に一致し;ます。

のような行が表示されると'19.08.2013;47657;"12459 \"Abdullahi\"";60;'、後者の式は19.08.2013;47657;12459 \"Abdullahi\";60;< を返します。エスケープされていない引用符のみが削除されます。

于 2013-08-19T14:23:18.517 に答える
-1

これを試して

$array = array('19.08.2013',47657,'"12459 Abdullahi"');
$array = str_replace('"', '', $array);
outputCSV($array);

したがって、コードでは次のようになります

$transaction_array = str_replace('"', '', $transaction_array);

またはこのスレッドを確認してください

fputcsv の使用時に csv ファイルからのデフォルトの引用を避ける

于 2013-08-19T14:24:44.483 に答える