Intereting Posts
Инструмент отчетности PHP с открытым исходным кодом Для чего нужны вложенные функции PHP? Как получить идентификатор клиента из объекта события в полосе Изменение алфавитной сортировки атрибутов / вариаций на странице продукта в магазине Woocommerce Как управлять запросами с ограниченным API-интерфейсом MySQL – Как получить результаты поиска с точной релевантностью Когда полезно использовать pass by reference в PHP? CodeIgniter расширяет несколько контроллеров? Создание таблицы mysql с переменной PHP Получение идентификатора пользователя от входа в систему пользователя в FOSUserBundle Динамические маршруты Codeigniter Использование одного параметра несколько раз в подготовленном mysqli-statement Как добавить / установить изображения на шаблоне PHPOffice / PHPWord? mysqli auto увеличил первичный идентификатор, который был сгенерирован База данных MySQL не запускается в XAMPP Manager-osx

Как создать массив из файла CSV с помощью PHP и функции fgetcsv

Может ли кто-нибудь предоставить код для создания массива из файла CSV с помощью fgetcsv?

Я использовал следующий код для создания массива из простого CSV-файла, но он не работает правильно, когда одно из моих полей имеет несколько запятых – например, адреса.

$lines =file('CSV Address.csv'); foreach($lines as $data) { list($name[],$address[],$status[]) = explode(',',$data); } 

* Кроме того, str_getcsv не поддерживается моей службой хостинга.

Вышеприведенный код не работает со следующим примером файла CSV. Первый столбец – это имя, второй столбец – адрес, третий – семейное.

 Scott L. Aranda,"123 Main Street, Bethesda, Maryland 20816",Single Todd D. Smith,"987 Elm Street, Alexandria, Virginia 22301",Single Edward M. Grass,"123 Main Street, Bethesda, Maryland 20816",Married Aaron G. Frantz,"987 Elm Street, Alexandria, Virginia 22301",Married Ryan V. Turner,"123 Main Street, Bethesda, Maryland 20816",Single 

Как вы сказали в своем названии, fgetcsv – это путь. Это довольно прост в использовании.

 $file = fopen('myCSVFile.csv', 'r'); while (($line = fgetcsv($file)) !== FALSE) { //$line is an array of the csv elements print_r($line); } fclose($file); 

Вы захотите поместить дополнительную проверку ошибок там, где fopen() терпит неудачу, но это работает для чтения файла CSV по строке и разбора строки в массив.

Я думаю, что синтаксис str_getcsv () намного чище, он также не требует сохранения CSV в файловой системе.

 $csv = str_getcsv(file_get_contents('myCSVFile.csv')); echo '<pre>'; print_r($csv); echo '</pre>'; 

Или для линейного решения:

 $csv = array(); $lines = file('myCSVFile.csv', FILE_IGNORE_NEW_LINES); foreach ($lines as $key => $value) { $csv[$key] = str_getcsv($value); } echo '<pre>'; print_r($csv); echo '</pre>'; 

Или для линейного решения без str_getcsv ():

 $csv = array(); $file = fopen('myCSVFile.csv', 'r'); while (($result = fgetcsv($file)) !== false) { $csv[] = $result; } fclose($file); echo '<pre>'; print_r($csv); echo '</pre>'; 

Я создал функцию, которая преобразует строку csv в массив. Функция знает, как избежать специальных символов, и работает с символами или без них.

Я попробовал это с вашим образцом csv, и он работает так, как ожидалось!

 function csvstring_to_array($string, $separatorChar = ',', $enclosureChar = '"', $newlineChar = "\n") { // @author: Klemen Nagode $array = array(); $size = strlen($string); $columnIndex = 0; $rowIndex = 0; $fieldValue=""; $isEnclosured = false; for($i=0; $i<$size;$i++) { $char = $string{$i}; $addChar = ""; if($isEnclosured) { if($char==$enclosureChar) { if($i+1<$size && $string{$i+1}==$enclosureChar){ // escaped char $addChar=$char; $i++; // dont check next char }else{ $isEnclosured = false; } }else { $addChar=$char; } }else { if($char==$enclosureChar) { $isEnclosured = true; }else { if($char==$separatorChar) { $array[$rowIndex][$columnIndex] = $fieldValue; $fieldValue=""; $columnIndex++; }elseif($char==$newlineChar) { echo $char; $array[$rowIndex][$columnIndex] = $fieldValue; $fieldValue=""; $columnIndex=0; $rowIndex++; }else { $addChar=$char; } } } if($addChar!=""){ $fieldValue.=$addChar; } } if($fieldValue) { // save last field $array[$rowIndex][$columnIndex] = $fieldValue; } return $array; } 

Старый вопрос, но все еще актуальный для пользователей PHP 5.2. str_getcsv доступен из PHP 5.3. Я написал небольшую функцию, которая работает с самим fgetcsv.

Ниже приведена моя функция из https://gist.github.com/4152628 :

 function parse_csv_file($csvfile) { $csv = Array(); $rowcount = 0; if (($handle = fopen($csvfile, "r")) !== FALSE) { $max_line_length = defined('MAX_LINE_LENGTH') ? MAX_LINE_LENGTH : 10000; $header = fgetcsv($handle, $max_line_length); $header_colcount = count($header); while (($row = fgetcsv($handle, $max_line_length)) !== FALSE) { $row_colcount = count($row); if ($row_colcount == $header_colcount) { $entry = array_combine($header, $row); $csv[] = $entry; } else { error_log("csvreader: Invalid number of columns at line " . ($rowcount + 2) . " (row " . ($rowcount + 1) . "). Expected=$header_colcount Got=$row_colcount"); return null; } $rowcount++; } //echo "Totally $rowcount rows found\n"; fclose($handle); } else { error_log("csvreader: Could not read CSV \"$csvfile\""); return null; } return $csv; } 

Возвращает

Начать чтение CSV

 Array ( [0] => Array ( [vid] => [agency] => [division] => Division [country] => [station] => Duty Station [unit] => Unit / Department [grade] => [funding] => Fund Code [number] => Country Office Position Number [wnumber] => Wings Position Number [title] => Position Title [tor] => Tor Text [tor_file] => [status] => [datetime] => Entry on Wings [laction] => [supervisor] => Supervisor Index Number [asupervisor] => Alternative Supervisor Index [author] => [category] => [parent] => Reporting to Which Position Number [vacant] => Status (Vacant / Filled) [index] => Index Number ) [1] => Array ( [vid] => [agency] => WFP [division] => KEN Kenya, The Republic Of [country] => [station] => Nairobi [unit] => Human Resources Officer P4 [grade] => P-4 [funding] => 5000001 [number] => 22018154 [wnumber] => [title] => Human Resources Officer P4 [tor] => [tor_file] => [status] => [datetime] => [laction] => [supervisor] => [asupervisor] => [author] => [category] => Professional [parent] => [vacant] => [index] => xxxxx ) ) 
 $arrayFromCSV = array_map('str_getcsv', file('/path/to/file.csv')); 

Попробуй это..

 function getdata($csvFile){ $file_handle = fopen($csvFile, 'r'); while (!feof($file_handle) ) { $line_of_text[] = fgetcsv($file_handle, 1024); } fclose($file_handle); return $line_of_text; } // Set path to CSV file $csvFile = 'test.csv'; $csv = getdata($csvFile); echo '<pre>'; print_r($csv); echo '</pre>'; Array ( [0] => Array ( [0] => Project [1] => Date [2] => User [3] => Activity [4] => Issue [5] => Comment [6] => Hours ) [1] => Array ( [0] => test [1] => 04/30/2015 [2] => test [3] => test [4] => test [5] => [6] => 6.00 )); 

Эта функция вернет массив с значениями заголовка в виде ключей массива.

 function csv_to_array($file_name) { $data = $header = array(); $i = 0; $file = fopen($file_name, 'r'); while (($line = fgetcsv($file)) !== FALSE) { if( $i==0 ) { $header = $line; } else { $data[] = $line; } $i++; } fclose($file); foreach ($data as $key => $_value) { $new_item = array(); foreach ($_value as $key => $value) { $new_item[ $header[$key] ] =$value; } $_data[] = $new_item; } return $_data; } 

Попробуйте этот код:

 function readCsv($file) { if (($handle = fopen($file, 'r')) !== FALSE) { while (($lineArray = fgetcsv($handle, 4000)) !== FALSE) { print_r(lineArray); } fclose($handle); } } 

Пожалуйста, перейдите ниже ссылки на функцию из @knagode, расширенной с параметром skip rows. https://gist.github.com/gabrieljenik/47fc38ae47d99868d5b3#file-csv_to_array

 <?php /** * Convert a CSV string into an array. * * @param $string * @param $separatorChar * @param $enclosureChar * @param $newlineChar * @param $skip_rows * @return array */ public static function csvstring_to_array($string, $skip_rows = 0, $separatorChar = ';', $enclosureChar = '"', $newlineChar = "\n") { // @author: Klemen Nagode // @source: http://stackoverflow.com/questions/1269562/how-to-create-an-array-from-a-csv-file-using-php-and-the-fgetcsv-function $array = array(); $size = strlen($string); $columnIndex = 0; $rowIndex = 0; $fieldValue=""; $isEnclosured = false; for($i=0; $i<$size;$i++) { $char = $string{$i}; $addChar = ""; if($isEnclosured) { if($char==$enclosureChar) { if($i+1<$size && $string{$i+1}==$enclosureChar){ // escaped char $addChar=$char; $i++; // dont check next char }else{ $isEnclosured = false; } }else { $addChar=$char; } }else { if($char==$enclosureChar) { $isEnclosured = true; }else { if($char==$separatorChar) { $array[$rowIndex][$columnIndex] = $fieldValue; $fieldValue=""; $columnIndex++; }elseif($char==$newlineChar) { echo $char; $array[$rowIndex][$columnIndex] = $fieldValue; $fieldValue=""; $columnIndex=0; $rowIndex++; }else { $addChar=$char; } } } if($addChar!=""){ $fieldValue.=$addChar; } } if($fieldValue) { // save last field $array[$rowIndex][$columnIndex] = $fieldValue; } /** * Skip rows. * Returning empty array if being told to skip all rows in the array. */ if ($skip_rows > 0) { if (count($array) == $skip_rows) $array = array(); elseif (count($array) > $skip_rows) $array = array_slice($array, $skip_rows); } return $array; } 

Чтобы получить массив с правильными клавишами, вы можете попробовать следующее:

 // Open file $file = fopen($file_path, 'r'); // Headers $headers = fgetcsv($file); // Rows $data = []; while (($row = fgetcsv($file)) !== false) { $item = []; foreach ($row as $key => $value) $item[$headers[$key]] = $value ?: null; $data[] = $item; } // Close file fclose($file); 

Я придумал этот довольно простой код. Я думаю, что это может быть полезно кому угодно.

 $link = "link to the CSV here" $fp = fopen($link, 'r'); while(($line = fgetcsv($fp)) !== FALSE) { foreach($line as $key => $value) { echo $key . " - " . $value . "<br>"; } } fclose($fp);