Подтвердить что ты не робот

Php fgetcsv возвращает все строки

У меня есть следующий файл csv:

upc/ean/isbn,item name,category,supplier id,cost price,unit price,tax 1 name,tax 1 percent,tax 2 name,tax 2 percent,quantity,reorder level,description,allow alt. description,item has serial number
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,

Когда я это сделаю:

if (($handle = fopen($_FILES['file_path']['tmp_name'], "r")) !== FALSE) 
{
    $data = fgetcsv($handle);
    var_dump($data);
}

Я получаю массив с 183 элементами, я ожидал бы получить только одну строку csv, но я получаю весь файл.

Я даже попробовал $data = fgetcsv($handle, 1000);, и получил тот же результат

4b9b3361

Ответ 1

Это, скорее всего, проблема с окончанием строки. Попробуйте включить auto_detect_line_endings, который попытается определить окончание строки файла.

ini_set('auto_detect_line_endings', true);

Если это не решит проблему, определить тип терминаторов строк, используя file команда:

$ file example.csv
example.csv: ASCII text, with CR line terminators

Вы можете преобразовать окончания строки. Я не уверен, какую ОС вы используете, но есть много утилит там для преобразования формата файла, например. dos2unix.

Ответ 2

Это кратчайшее решение, о котором я мог подумать:

$fp = fopen('test.csv', 'r');

// get the first (header) line
$header = fgetcsv($fp);

// get the rest of the rows
$data = array();
while ($row = fgetcsv($fp)) {
  $arr = array();
  foreach ($header as $i => $col)
    $arr[$col] = $row[$i];
  $data[] = $arr;
}

print_r($data);

Вывод:

Array
(
    [0] => Array
        (
            [upc/ean/isbn] => 
            [item name] => Apple iMac
            [category] => Computers
            [supplier id] => 
            [cost price] => 10
            [unit price] => 12
            [tax 1 name] => 8
            [tax 1 percent] => 8
            [tax 2 name] => 10
            [tax 2 percent] => 10
            [quantity] => 10
            [reorder level] => 1
            [description] => Best computer
            [allow alt. description] => 
            [item has serial number] => 
        )

    [1] => Array
        (
            [upc/ean/isbn] => 
            [item name] => Apple iMac
            [category] => Computers
            [supplier id] => 
            [cost price] => 10
            [unit price] => 12
            [tax 1 name] => 8
            [tax 1 percent] => 8
            [tax 2 name] => 10
            [tax 2 percent] => 10
            [quantity] => 10
            [reorder level] => 1
            [description] => Best computer
            [allow alt. description] => 
            [item has serial number] => 
        )

    // ...

    [11] => Array
        (
            [upc/ean/isbn] => 
            [item name] => Apple iMac
            [category] => Computers
            [supplier id] => 
            [cost price] => 10
            [unit price] => 12
            [tax 1 name] => 8
            [tax 1 percent] => 8
            [tax 2 name] => 10
            [tax 2 percent] => 10
            [quantity] => 10
            [reorder level] => 1
            [description] => Best computer
            [allow alt. description] => 
            [item has serial number] => 
        )

)

Ответ 3

попробовать:

 while (($data = fgetcsv($handle, 0, ',')) !== FALSE) {
    $columns = count($data);
 }

В качестве альтернативы вы можете попробовать использовать str_getcsv(file_get_contents(...))

Ответ 4

У вас такая же проблема, на Mac, с CSV файлом, созданным Microsoft Excel. Я выполнил команду больше в разных файлах, и кажется, что окончание строки отличается.

$ more excel.csv && more test.csv
[email protected]^[email protected]^[email protected]^M
[email protected]
[email protected]
[email protected]

Я использовал

ini_set('auto_detect_line_endings', true);

перед

fgetcsv($handle, 0, ';')

и он работает. Принятый ответ правильный.

Ответ 5

Для чтения во весь CSV файл сразу используйте:

$data = array_map("str_getcsv", file($fn));
var_dump($data);

Хотя вам придется использовать array_shift() первую строку (если вы не используете клавиши столбца).


Обходной путь для нестандартных строк:

$data = array_map("str_getcsv", preg_split('/[\r\n]+/', file_get_contents($fn)));
var_dump($data);

Ответ 6

Если у вас есть опция, верните отредактируйте свой CSV файл, чтобы включить конец строки стиля Unix... тогда fgetcsv автоматически разбивает массив на концы строк