3

リモート CSV ファイルを読み取り、CSV ファイルの内容に基づいて製品をデータベースに追加する php スクリプトがあります。現在、約 2800 行 (製品) がありますが、スクリプトは 1388 行で停止し続けています。

私が使用したコードは次のとおりです。

while(($data = fgetcsv($fopen, 0, ",")) !== false):
  //stuff is done here...
endwhile;

PHP のメモリ制限を 64M に設定し、128M も試しました。また、max_execution_time を 60 分に設定しました。また、次のようにコードを変更しようとしました。

while(($data = fgetcsv($fopen, 1000, ",", '\r')) !== false):
  //stuff is done here...
endwhile;

その DID により、より多くの行が解析されますが、データが正しくありませんでした。つまり、画像の列が説明の列などになっていました。これは、行末として \r を追加することに関係していると思います。\n試してみましたが、うまくいきませんでした。最後に、ini で auto_detect_line_endings を true として追加しました。

私のデータが短縮されている理由を誰か提案できますか?

よろしく、サイモン

編集

興味深いことに気がつきました。上記のコードでループされている各行に MySQL 挿入があります。現在、私のデータベースの最後のレコードは CSV ファイルの最初の行です。これは、ファイルが最後の行から解析されているということですか??

これらは、ブレークまたはその近くの行のようです。

W-3066,  I Love Love Cheap And Chic,     Moschino, 3.4 oz,EDT Spray,Women,,"Introduced by the design house of Moschino, I love love has a blend of grapefruit, orange, lemon, red currant, tea rose, cinnamon leaves, musk, cedar and tonka wood. It is recommended for daytime wear.",http://www.perfume-worldwide.com/products/Women/Final/W-3066large.jpg,0,0,0,8011003991457
W-3070,  Adidas Floral Dream,            Adidas,   1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are bergamot, lily, rose, tonka bean and vanilla.",http://www.perfume-worldwide.com/products/Women/Final/W-3070large.jpg,0,0,0,3412244310024
W-3071,  Adidas Fruity Rhythm,           Adidas,   1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are black currant, raspberry, cyclamen, freesia and musk.",http://www.perfume-worldwide.com/products/Women/Final/W-3071large.jpg,0,0,0,3412244510004

解決

結局のところ、ファイルをサーバーにコピーし、そのコピーから作業する方がずっとうまくいきました。私が従った手順は次のとおりです。

  • を使用してリモートファイルの内容を読み取りますfile_get_contents()
  • 次に、iconv()関数を使用して、データをUTF-8に再エンコードしました
  • fopen()fwrite()および関数を使用して一時ファイルを作成しましたfclose()。ファイルの内容は上記のエンコードされたデータでした
  • chmod()関数を使用してファイルのパーミッションを 0750 に設定しました
  • 次に、fgetcsv()関数を一時ファイルに適用しました
  • 必要な作業はすべて完了しましたか
  • unlink()関数を使用して、完了したら一時ファイルを削除しました

それはトリックをしました。したがって、問題の半分は実際にはリモート サーバーのタイムアウトであり、残りの半分はエンコードの問題であると思われます。

正しい方向へのすべての微調整をしてくれたみんなに感謝します

4

2 に答える 2

2

ファイルは正しくフォーマットされていますか? 区切り文字と終了行を指定できるcsvリーダーでファイルを開こうとしましたか?これによる判断:

その DID により、より多くの行が解析されますが、データは正しくありませんでした。つまり、画像列が説明列になっていました。

データが破損している可能性があると思います (つまり、一部の説明にカンマ、エンドラインなどがあります)。データが動的に生成され、正しくフォーマットされていない場合に発生します。

txtエディター(つまり、メモ帳++)でも開いて、それがどのように見えるかを確認してください..

于 2011-04-07T10:45:04.993 に答える
2

まず、いくつか質問があります。

  • 138813881389行にあるもの
  • 出力されているエラーはありますか
  • 最終行に到達したら、( $data[0] === null)を取得しますか?

メモリ制限に関する情報は、おそらくそれを引き起こしている問題ではないでしょう.fgetcsvは反復ごとに1行を読み取るため、メモリには一度に1行分のデータしかありません.

データを配列に配置したり、それらを連結したりし続ける場合は、ループ内で。これによりメモリリークが発生する可能性がありますが、より詳細なコードを表示する必要があります

fgetcsvCSV ファイルを正しく解析できるようにするには、CSV ファイルを適切に構造化する必要があります。CSV ファイルを使用する際に覚えておくべきルールがいくつかあります。

  • 最初の行は常に列名でなければなりません
  • 他のすべての行はデータ行です。
    • 各要素,
    • 要素にスペースまたはカンマ (, , ) が含まれる場合は、'\n'二重引用符で囲む必要があります。'\r''\r\n'

有効な CSV ファイルの例は次のようになります。

id, firstname, lastname, age, profile_description
0,  Robert,    Pitt,     22,  "this string has spaces, and has a comma"

構造が正しいことを検証する必要があります。正しくない場合は、解析がデータを正しく読み取れるようになるまでこれを修正する必要があります。その後、データを新しい CSV ファイルにきれいに配置して、小さな不正確な構造をすべて処理します。 .

于 2011-04-07T10:46:47.550 に答える