PHP fgetcsv с недопустимым CSV-файлом

#php #csv #fgetcsv

#php #csv #fgetcsv

Вопрос:

У меня есть CSV-файл с содержимым:

 Центральный;Московская область;117036;PC;JEEP;GRAND CHEROKEE;ДЖИП ГРАНД ЧЕРОКИ;В;01.01.0001;08.05.2014;2004;1J8G2Е8N94У161064;-;1J8G2Е8N94У161064;-;94;2;227;4701;1;1;29;2495;2073;ФИЗ ЛИЦО;-;АКАДЕМИЧЕСКИЙ (ЮЗАО) Р-Н;-;-;-
Центральный;Московская область;117036;PC;VAZ;LARGUS;ЛАДА ЛАРГУС FS015L;В;01.01.0001;08.05.2014;2014;ХТАFS015LЕ0811430;UА46515;ХТАFS015LЕ0811430;-;11;1;84;1598;1;1;09;2010;1260;"АЗИЯ МАТЕРИАЛ ХЭНДЛИНГ ООО;7728814946;АКАДЕМИЧЕСКИЙ (ЮЗАО) Р-Н;-;КРЖИЖАНОВСКОГО;2|21
Центральный;Московская область;117208;PC;TOYOTA;LANDCRUISER;ТОЙОТА ЛЕНД КРУЗЕР ПРАДО;В;01.01.0001;08.05.2014;2001;JТЕВN99J100077420;1122027;JТЕВN99J100077420;JТЕВN99J100077420;94;2;178;3378;1;1;21;2680;1900;ФИЗ ЛИЦО;-;ЧЕРТАНОВО СЕВЕРНОЕ (ЮАО) Р-Н;-;-;- 

Я попытался импортировать этот CSV-файл в SQL DB с помощью этого цикла while:

 while (($csv_data = fgetcsv($csv_file, 10000, ';', '"')) !== false) {
  //some stuff
} 

В этом CSV-файле у меня есть 3 записи, но в SQL я вижу только 2. Проблема в этой строке:

;1260;»АЗИЯ МАТЕРИАЛ ХЭНДЛИНГ ООО;7728814946;

Проблема в дополнительном символе «перед АЗИЯ». Как я могу правильно разобрать этот CSV-файл? Размер файла превышает 200 Мб.

Комментарии:

1. Не указывайте " в качестве вложения, если оно вам не нужно ни для каких других данных. Если вам это действительно нужно — тогда вам придется как-то исправить это вручную, fgetcsv вероятно, вы не сможете угадать , когда это должен быть символ вложения, а когда просто данные.

2. @CBroe, спасибо. Я также пробовал этот код fgetcsv($csv_file, 10000, ‘;’), но результат тот же.

3. Конечно — $enclosure это необязательный параметр, имеющий значение по умолчанию " . Таким образом, вы фактически все еще делаете то же самое, только неявно, а не явно. Попробуйте указать пустую строку (если PHP принимает это, не проверял), а если нет, найдите какой -нибудь символ, который никогда не будет частью ваших данных (если сможете).

4. @CBroe, спасибо! Пустая строка не работает, но она работает с символом s: fgetcsv($csv_file, 10000, ‘;’, ‘s’) Я получаю много уведомлений: Обратите внимание: fgetcsv(): в приложении должен быть один символ, но это нормально 🙂

5. Это принимает только один символ, поэтому, если вы указали s в качестве значения для этого параметра, ваш символ вложения фактически просто — поэтому, если когда-либо может быть частью ваших данных , это все равно приведет к сбою в таких местах.


Ответ №1:

===== РЕДАКТИРОВАТЬ =======

Хорошо, очевидно, что ваш CSV обрабатывается неправильно, я использовал разные данные и думал, что CSV — это CSV, и этот пример работал так же хорошо, как idk. Теперь он работает с вашими данными. Единственная проблема — ваша " , это вызывает проблемы

введите описание изображения здесь

(Я заменил ваш первый элемент, потому что я не говорю по-русски и не вижу различий в словах)

 $file_data = array_filter(explode("n", file_get_contents("data.csv")));
$data = array();

foreach ($file_data as $key => $row) {
  $data[] = str_getcsv($row, ';', '', "\");
}

print_r($data);
 

===== СТАРОЕ СООБЩЕНИЕ =======

Я попробовал этот пример PHP, и он сработал так же хорошо.

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

Комментарии:

1. Здравствуйте. Почему, делиметр? Ваш код не работал с рассматриваемым примером csv. Я нахожу это решение: fgetcsv($csv_file, 10000, ‘;’, ‘s’)