0

データベースから取得したデータを使用して PHP で CSV ファイルに書き込む最も効率的な方法を再確認したいだけです。

現在、SQLクエリを実行してデータを取得した後、whileループを使用してデータを変数に割り当て、そのwhileループ内でファイルに書き込みます。そのようです

$fp = fopen("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", 'a+');
$data = array();

while ($row = sqlsrv_fetch_array($getList,  SQLSRV_FETCH_ASSOC)) { 
     $data['id'] = $row['id'];
     $data['empId'] = $row['empId'];
     $data['fullname'] = $row['fullname'];
     $data['title'] = $row['title'];
     $data['department'] = $row['department'];

    fputcsv($fp, array_values($data));
}       

fclose($fp); 

各反復からのデータをcsv形式の文字列変数に割り当ててから、ループ全体で連結する方が速いのではないかと思っています。ループが完了したら、その変数をファイルに書き込みますか? それは何らかの形でより速いでしょうか?または、より効率的なcsvファイルに完全に書き込む別の方法はありますか?

4

2 に答える 2

2

あなたの例から、PHPはデータに対して何もしていないように見えるので、ほとんどすべてのPHPのやり取りを避けてみませんか? ほとんどのデータベースには、PHP を完全に回避して CSV ファイルを直接書き込む方法があります。

例: MySQL SELECT ... INTO

例から:

SELECT a,b,a+b INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
于 2014-06-03T10:49:04.253 に答える
-1

ファイル全体をメモリに入れる余裕がある場合は、次のようにします。

$outarr = array();
while ($row = sqlsrv_fetch_array($getList,  SQLSRV_FETCH_NUMERIC)) { 
   array_push($outarr,implode(";",$row));
}
file_put_contents("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", implode($outarr,"\n"));

いくつかのトレードオフがあります。

  • SQLステートメントは、csvで必要な列のみを返す必要があります
  • セル区切り文字は固定です => ;
  • 行区切り文字が固定されている => 改行 (UNIX コーディング)
  • 適切なcsvコーディングは、セルまたは行区切り文字を含む値を引用符で囲みます->フィールド名は、あなたの場合、これは必要ないという仮定につながりました
于 2014-06-03T10:58:33.070 に答える