#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’)