Преобразование CSV в массив

У меня есть этот массив с кодами аэропортов и названиями городов (около 3500 строк).

code,city
"Abilene, TX ",ABI
"Adak Island, AK ",ADK
"Akiachak, AK ",KKI
"Akiak, AK ",AKI
"Akron/Canton, OH ",CAK
"Akuton, AK ",KQA
"Alakanuk, AK ",AUK
"Alamogordo, NM ",ALM

Мне нужно преобразовать этот файл в массив php. Это мой код на данный момент:

if(($handle = fopen('test.csv', 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ',', '"')) !== FALSE) {
        echo '<pre>';
            print_r($data);
            echo '</pre>';
    }
    fclose($handle);
}

Хотя я устанавливаю символы разделителя и включения для функции fgetcsv, в результате я получаю следующее:

Array
(
    [0] => code
    [1] => city
"Abilene
    [2] => TX "
    [3] => ABI
"Adak Island
    [4] => AK "
    [5] => ADK
"Akiachak
    [6] => AK "
    [7] => KKI
"Akiak
    [8] => AK "
    [9] => AKI
"Akron/Canton
    [10] => OH "
    [11] => CAK
"Akuton
    [12] => AK "
    [13] => KQA
"Alakanuk
    [14] => AK "
    [15] => AUK
"Alamogordo
    [16] => NM "
    [17] => ALM
)

person Andres SK    schedule 21.09.2011    source источник
comment
Вы уверены, что это " символы, а не причудливые символы 66 и 99, которые MS любит разбрасывать повсюду?   -  person Marc B    schedule 21.09.2011
comment
У меня отлично работает. Вероятно, ошибка в вашем PHP_VERSION. (Что это такое?) Или попробуйте var_dump(array_map("str_getcsv", file($fn))).   -  person mario    schedule 21.09.2011
comment
@StefanPantke: Теперь, когда вы это упомянули. Он получает из этого ровно одну пластинку. Таким образом, разрывы строк не распознаются, поэтому кавычки также интерпретируются неверно.   -  person mario    schedule 21.09.2011
comment
См. Также настройку php.ini auto_detect_line_endings   -  person mario    schedule 21.09.2011
comment
@StefanPantke: 1 - это просто результат print_r(), который записывается echo после print_r, который сам уже выбросил свой вывод. (Почему его также нет в предварительных тегах.)   -  person mario    schedule 21.09.2011
comment
@MarcB да, это нормальные цитаты   -  person Andres SK    schedule 21.09.2011
comment
@StefanPantke Я исправил вывод, но проблема не в этом. Я думаю, что Марио в некотором роде прав в переносе строк.   -  person Andres SK    schedule 21.09.2011
comment
Возможный дубликат Как создать массив из файла CSV с помощью PHP и функции fgetcsv   -  person Ali Hesari    schedule 21.09.2017


Ответы (3)


Если это разрывы строк, вы можете попробовать метод перебора с помощью:

$file = file_get_contents("test.csv");
$data = array_map("str_getcsv", preg_split('/\r*\n+|\r+/', $file));
print_r($data);

str_getcsv доступен в PHP 5.3 или в качестве временного решения в руководстве через upgradephp или PHP_Compat.

person mario    schedule 21.09.2011
comment
Отлично, это решило мою проблему. Большое спасибо - person Raj; 16.12.2014
comment
Большое спасибо +1 также за неизвестное обновление php !! - person Magico; 05.11.2015

Попробуй это:-

ini_set('auto_detect_line_endings', TRUE);/// (PHP's detection of line endings) write at the top.


$csvrows = array_map('str_getcsv', file($filepath));
$csvheader = array_shift($csvrows);
$csv = array();
foreach ($csvrows as $row) {
   $csv[] = array_combine($csvheader, $row);
}
person vineet    schedule 13.12.2014

пытаться-

$csv = array();

if (($file = fopen('test.csv', 'r')) === false) {
    throw new Exception('There was an error loading the CSV file.');
} else {  
   while (($line = fgetcsv($file, 1000)) !== false) {
      $csv[] = $line;
   }
   fclose($handle);
}
person Rekha    schedule 23.12.2014