php fgetcsv возвращает все строки - PullRequest
36 голосов
/ 04 апреля 2011

У меня есть следующий 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);, и я получил тот же результат

Ответы [ 6 ]

102 голосов
/ 04 апреля 2011

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

ini_set('auto_detect_line_endings', true);

Если это не решит проблему, тогда определяет типограничители строки с помощью команды file:

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

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

5 голосов
/ 04 апреля 2011

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

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

)
1 голос
/ 10 марта 2017

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

$ more excel.csv && more test.csv
aaa@aaa.fr^Mbbb@bbb.fr^Mccc@ccc.fr^M
ddd@ddd.fr
eee@eee.fr
fff@fff.fr

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

ini_set('auto_detect_line_endings', true);

до

fgetcsv($handle, 0, ';')

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

1 голос
/ 04 апреля 2011

Чтобы прочитать сразу весь файл 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);
1 голос
/ 04 апреля 2011

try:

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

Кроме того, вы можете попробовать использовать str_getcsv(file_get_contents(...))

0 голосов
/ 29 августа 2012

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

...