有没有人能提供一个使用fgetcsv从CSV文件创建数组的代码?
我使用下面的代码从一个简单的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
发布于 2009-08-13 01:41:14
就像你在标题中所说的,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文件,并将该行解析为数组。
发布于 2009-08-13 02:20:15
我认为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>';
发布于 2011-02-12 09:34:42
我已经创建了一个将csv字符串转换为数组的函数。该函数知道如何转义特殊字符,它可以使用或不使用封闭字符。
$dataArray = csvstring_to_array( file_get_contents('Address.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;
}
https://stackoverflow.com/questions/1269562
复制相似问题