2

ユーザーがデータをアップロードできるようにする PHP スクリプトがあります。csv ファイルの最初の行はヘッダー (fname、lname、age、address、email) です。

私の計画は - ユーザーが csv をアップロードした後、私のスクリプトはヘッダーのスペルをチェックする関数を実行します。スペルが間違っているヘッダーがある場合、私のスクリプトはそれを修正します。以下のコードを使用してヘッダーを修正しています。

   if (($file = fopen($csvFile , "r")) != FALSE) {
        $ctr = 0;
        $record = fgetcsv($file, 1024)) != FALSE) {
            if ($ctr == 0) {
                correctHeader($record);
                # write to new csv.
            } else {
                # write to new csv.
            }
        }
    }

修正後、ヘッダーと後続の行の値が新しい csv ファイルに追加されます。csv(ヘッダー)の最初の行を編集してステップをスキップできれば、このステップを最適化できると思います# write to new csv

4

1 に答える 1

0

私が考えることができる方法の1つは次のとおりです。

  1. ファイルの最初の行を取得するために使用fgets()します (の代わりにfgetcsv())。
  2. 行の長さをバイト単位で保存します。
  3. で行を解析しstr_getcsv()ます。
  4. 必要に応じてヘッダーを修正します。
  5. ヘッダーを新しい CSV ファイルに保存します。
  6. fopen()読み取り用の元の CSV ファイル。
  7. fseek()元の CSV ファイル ハンドルから最初の行の長さ (手順 2 で保存) + 1。
  8. fopen()書き込み用の新しい CSV ファイル (実際には追加)。
  9. fread()EOF までのループ内の元の CSV ファイルとfwrite()、新しい CSV ファイルへのチャンク。
  10. バグを修正します。
  11. パイントをどうぞ。:)

コードは次のとおりです(読み取り用のループを除く):

<?php
$from = 'd.csv';
$to = 'd.good.csv';

$old = fopen($from, 'r');
if (!is_resource($old)) {
    die("Failed to read from source file: $from");
}

$headerLine = fgets($old);
$headerLine = fixHeaders($headerLine);

$new = fopen($to, 'w');
if (!is_resource($new)) {
    die("Failed to write to destination file: $new");
}
// Save the fixed header into the new file
fputs($new, $headerLine);
// Read the rest of old and save to new.
// Old file is already open and we are the second line.
// For large files, reading should probably be done in the loop with chunks.
fwrite($new, fread($old, filesize($from)));

// Close files
fclose($old);
fclose($new);

// Just an example
function fixHeaders($line) {
    return strtoupper($line);
}
于 2014-01-28T10:12:18.437 に答える