Я пытаюсь разобрать строку 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""
Как я могу это исправить? Любая помощь будет оценена по достоинству.
Сделай это:
$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'));