Строка PHP CSV для массива

Я пытаюсь разобрать строку CSV на массив в PHP. Строка CSV имеет следующие атрибуты:

Delimiter: , Enclosure: " New line: \r\n 

Пример содержимого:

 "12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013" "12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013" 

Когда я пытаюсь разобрать его так:

 $url = "http://www.url-to-feed.com"; $csv = file_get_contents($url); $data = str_getcsv($csv); var_dump($data); 

Последний и первый элементы объединены в одну строку:

 [0]=> string(5) "12345" ... [7]=> string(4) "0.04" [8]=> string(19) "27-05-2013 "12346"" 

Как я могу это исправить? Любая помощь будет оценена по достоинству.

Related of "Строка PHP CSV для массива"

Сделай это:

 $csvData = file_get_contents($fileName); $lines = explode(PHP_EOL, $csvData); $array = array(); foreach ($lines as $line) { $array[] = str_getcsv($line); } print_r($array); 

Он даст вам результат следующим образом:

 Array ( [0] => Array ( [0] => 12345 [1] => Computers [2] => Acer [3] => 4 [4] => Varta [5] => 5.93 [6] => 1 [7] => 0.04 [8] => 27-05-2013 ) [1] => Array ( [0] => 12346 [1] => Computers [2] => Acer [3] => 5 [4] => Decra [5] => 5.94 [6] => 1 [7] => 0.04 [8] => 27-05-2013 ) ) 

Надеюсь, это может помочь.

Handy oneliner:

 $csv = array_map('str_getcsv', file('data.csv')); 

Вы должны использовать fgetcsv. Поскольку вы не можете импортировать файл как поток, потому что csv – это переменная, вы должны обманывать строку как файл, сначала используя php://temp или php://memory :

 $fp = fopen("php://temp", 'r+'); fputs($fp, $csvText); rewind($fp); 

Тогда у вас не будет проблем с использованием fgetcsv:

 $csv = []; while ( ($data = fgetcsv($fp) ) !== FALSE ) { $csv[] = $data; } 

$data будет массивом одной строки csv (которая может включать разрывы строк или запятые и т. д.), как и должно быть.

Я использовал следующую функцию для синтаксического анализа строки csv для ассоциативного массива

 public function csvToArray($file) { $rows = array(); $headers = array(); if (file_exists($file) && is_readable($file)) { $handle = fopen($file, 'r'); while (!feof($handle)) { $row = fgetcsv($handle, 10240, ',', '"'); if (empty($headers)) $headers = $row; else if (is_array($row)) { array_splice($row, count($headers)); $rows[] = array_combine($headers, $row); } } fclose($handle); } else { throw new Exception($file . ' doesn`t exist or is not readable.'); } return $rows; } 

если ваше имя файла csv – mycsv.csv, вы вызываете эту функцию следующим образом:

 $dataArray = csvToArray(mycsv.csv); 

вы можете получить этот скрипт также в http://www.scriptville.in/parse-csv-data-to-array/

Немного короче, без лишней второй переменной:

 $csv = <<<'ENDLIST' "12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013" "12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013" ENDLIST; $arr = explode("\n", $csv); foreach ($arr as &$line) { $line = str_getcsv($line); } 

Если вам нужно имя для столбцов csv, вы можете использовать этот метод

  $example= array_map(function($v) {$column = str_getcsv($v, ";");return array("foo" => $column[0],"bar" => $column[1]);},file('file.csv'));