0

次のように .CSV をアプリケーションにインポートしています。

if (($handle = fopen($file, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}

ある程度は機能しますが、完璧にはほど遠いです。最初に行の先頭を取得して配列に入れ、次に各行をループしてデータ セットを取得したいと考えていました。

最初の行 (ヘッド) には 2 番目の行のいくつかの部分も含まれているため、区切りの問題が発生しているようです。

.csv ファイルを Excel から直接エクスポートしました。エンコーディングのトリックなどがあるのではないかと思います。

4

4 に答える 4

3

1000制限の長さが足りないようです。そのファイルに対して十分に高い値に設定する必要があります...または0無制限に設定する必要があります(遅くなる傾向があるため、お勧めしません)。

4096または最初に設定して8192、様子を見てください。

// use 8kB buffer for reading comma delimited line
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {

アップデート

さて、考え直して、おそらくファイルを調べて、いくつかのことを確認する必要があります。

  1. 区切り文字は本当にコンマですか? (既に確立されていると思います)
  2. 文字列の囲みは常に二重引用符ですか?
  3. 文字列はバックスラッシュ (デフォルト) または別の二重引用符でエスケープされていますか?
于 2012-06-12T15:21:12.940 に答える
1

fgetcsv行末を常に正しく検出するとは限りません。

fgetcsv 呼び出しの前に使用してみてください。

ini_set('auto_detect_line_endings', true);
于 2012-06-12T15:59:31.207 に答える
0

8192 に変更しましたが、同じ結果が得られました

while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
...
}

そして、これを実行して同じ結果を得ました

$handle = fopen($_FILES['filename']['tmp_name'], "r");
ini_set('auto_detect_line_endings', true);
    while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
         $data = array_map('mysql_real_escape_string', $data);
于 2016-03-07T16:51:19.913 に答える
-1

file() を使用しないのはなぜですか?

     $trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
于 2012-06-12T15:26:46.803 に答える