Файл str_getcsv () возвращает все строки в одном длинном массиве, а fgetcsv () возвращает только верхнюю строку заголовка - PullRequest
1 голос
/ 28 февраля 2012

У меня есть файл, который я сохранил как CSV-файл с помощью Excel (я пытался как с Windows 7, так и с Mac OSX, чтобы избежать проблем с совместимостью).

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

ini_set('auto_detect_line_endings', true);
$filename = 'import/clientsimport.csv';
$csvfile = file_get_contents($filename);
$csvarray = str_getcsv($csvfile);
print_r($csvarray);
mysql_close();

Все строки превращаются в одну строку, и я получаю массив, который имеет глубину только 1 уровень и работает с тысячами ключей.

Итак, я попробовал альтернативный подход:

ini_set('auto_detect_line_endings', true);
$filename = 'import/clientsimport.csv';
$csvfile = fopen($filename,'r');
$csvarray = fgetcsv($csvfile);
print_r($csvarray);

Это ТОЛЬКО возвращает 1-й ряд (ряд заголовков) и не выходит за его пределы. Как мне сделать это правильно? Есть сотни рядов и около дюжины массивов в ряду, поэтому я должен получить двухмерный.

В CSV каждая строка разбита переносом строки, а значения, разделенные запятыми, - без вложений.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Как насчет этого:

$multiarray = array();
while ($linearray = fgetcsv($cvsfile)) {
   $multiarray[] = $linearray;
}
1 голос
/ 28 февраля 2012

Решил вопрос другим поиском с другими ключевыми словами:

проблема с массивом php str_getcsv

Имеет ответ. По сути, я изменил свой механизм чтения файлов:

$csvfile = fopen($filename,'rb');
while(!feof($csvfile)) {
$csvarray[] = fgetcsv($csvfile);
}

рб Я предполагаю, что читает с переносами строк? И оператор while проходит по строкам. Я полностью забыл, как fopen работает с точки зрения разбиения содержимого на части и необходимости циклического прохождения, в отличие от file_get_contents (), который возвращает только одну длинную строку.

...