Почему функция fgetcsv() объединяет последовательные поля EMPTY в одно поле и помещает его в позицию одного массива?
Вот файл CSV:
a.csv:
"a","b",,"c",,"d","e","f",,"g","h","i","j",,,,,,,,,,,,,,"k",,,,,,,,,,,,,,,"l","m,n","o"
Теперь в этом файле CSV, ,
является символом разграничения между полями. Итак, первое поле a
второе поле b
, третье поле пусто, четвертое поле c
пятое поле снова пустое и т. д.
Вот мой пример кода:
index.php:
$file = fopen("a.csv", "r");
while ( !( ($line = fgetcsv($file, ',', '"')) === false ) ) {
print_r($line);echo "<br>";
}
ОЖИДАЕМЫЙ ВЫХОД:
Я ожидал, что этот фрагмент кода напечатает что-то вроде:
Array ( [0] => a, [1] => b [2] => [3] => c [4] => [5] => d ...so on
ВЫХОД Я ПОЛУЧИЛ:
Фактический вывод, который я получил:
Array ( [0] => a, [1] => b [2] => ,, [3] => c [4] => ,, [5] => d [6] => , [7] => e [8] => , [9] => f [10] => ,, [11] => g [12] => , [13] => h [14] => , [15] => i [16] => , [17] => j [18] => ,,,,,,,,,,,,,, [19] => k [20] => ,,,,,,,,,,,,,,, [21] => l [22] => , [23] => m,n [24] => , [25] => o [26] => )
ВОПРОС:
Во-первых, почему я получаю эти случайные запятые? Я говорю случайный, потому что, как вы видите, после первого элемента стоит запятая
a
, то после второго элемента запятой нетb
и после запятой нетc
либо (и так далее).Для полей, которые не имеют значения, т. Е. Которые пусты, почему он объединяет несколько полей, например, в поле, показанном в индексе
18
, около14
ПУСТЫЕ поля были объединены и помещены в одну позицию массива. Зачем? В результате этот выходной массив должен был содержать 43 элемента, а теперь - 26.
Как я могу исправить эти проблемы и получить ожидаемый результат?
Примечание. Я могу изменить значения разделителя и вложенного поля в файле CSV.
2 ответа
У вас неправильные параметры для fgetcsv
, Обратите внимание на второй параметр, длина которого вам не хватает. На самом деле, поскольку вам, похоже, нужно поведение по умолчанию, это должно сработать:
while ( !( ($line = fgetcsv($file)) === false ) ) {
Что вы на самом деле делаете в своем исходном коде, так это устанавливаете длину строки CSV равной ",", разделитель - двойную кавычку, а не устанавливаете вложение, что также означает, что по умолчанию используется двойная кавычка. Это явно сбивает с толку парсера.
(Между прочим, вы можете также захотеть убедиться, что файл существует, прежде чем использовать его, иначе ваш код попадет в бесконечный цикл, так как fgetcsv возвращает NULL.)
Моя проблема заключалась в том, что мой редактор PhpStorm автоматически удалял конечные пробелы (= также вкладки) в настройках phpstorm Editor->general->Skip trails Пробелы = нет