如何使用PHP和fgetcsv函数从CSV文件创build数组
有人可以提供一个代码,使用fgetcsv从CSV文件创build一个数组?
我已经使用下面的代码从一个简单的CSV文件创build一个数组,但是当我的一个字段有多个逗号时(如地址),它不能正常工作。
$lines =file('CSV Address.csv'); foreach($lines as $data) { list($name[],$address[],$status[]) = explode(',',$data); }
*另外,我的托pipe服务不支持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文件,并将行parsing成一个数组。
我认为str_getcsv ()语法更简洁 ,也不需要将CSV存储在文件系统中。
$csv = str_getcsv(file_get_contents('myCSVFile.csv')); echo '<pre>'; print_r($csv); echo '</pre>';
或者对于逐行解决scheme:
$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()的逐行解决scheme:
$csv = array(); $file = fopen('myCSVFile.csv', 'r'); while (($result = fgetcsv($file)) !== false) { $csv[] = $result; } fclose($file); echo '<pre>'; print_r($csv); echo '</pre>';
我已经创build了一个将csvstring转换为数组的函数。 该function知道如何转义特殊字符,它可以使用或不使用shell字符。
我试着用你的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本身一起使用的小函数。
以下是我的function从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 ));
这个函数将以数组键的forms返回数组。
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); } }
请在下面find@ 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);