2016-11-20 1 views
2

Вот файл CSV:Почему функция fgetcsv() объединяет последовательные EMPTY-поля в поле ONE и помещает их в позицию ОДНОГО блока?

a.csv:

"a","b",,"c",,"d","e","f",,"g","h","i","j",,,,,,,,,,,,,,"k",,,,,,,,,,,,,,,"l","m,n","o" 

Теперь в этом CSV файле, , является ограничивающим характером между полями. Тоже первое поле является a, второе поле - b, третье поле пусто, четвертое поле, пятое поле снова пустое и так далее.

Вот мой пример кода:

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 

OUTPUT I GOT:

Фактический выход я получил:

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] =>) 

ВОПРОС:

  1. Во-первых, почему я получаю те random запятые? Я говорю случайный, потому что, как вы можете видеть, есть запятая после первого элемента a, то после второго элемента b нет запятой, и после c нет запятой (или так далее).

  2. Для полей, которые не имеют значения, то есть пустого, почему оно объединяет несколько нескольких полей, например. в поле, показанном по индексу 18, около 14 Поля EMPTY были агрегированы и помещены в одно положение массива. Почему? Результатом этого является то, что этот выходной массив должен был содержать 43 элементов, и теперь он содержит 26.

Как исправить эти проблемы и получить ожидаемый результат?

Примечание: Я могу изменить значения разделителя и полей в файле CSV.

ответ

2

У вас есть неправильные параметры fgetcsv. Note the second parameter, length, который вам не хватает.На самом деле, как вы только, кажется, нужно поведение по умолчанию, это должно работать:

while (!(($line = fgetcsv($file)) === false)) { 

То, что вы на самом деле делаете в исходном коде устанавливает длину CSV строки в «», разделитель для двойного цитата, а не установка оболочки, что означает, что по умолчанию используется двойная кавычка. Это явно путает парсер.

(Кстати, вы также можете убедиться, что файл существует до его использования, иначе ваш код перейдет в бесконечный цикл, так как fgetcsv возвращает NULL.)

Смежные вопросы