csv导入函数
时间:2005-12-16 来源:odin_free
将csv文件导入数组,参考了phpmyadmin和一个asp朋友的例子[@more@]
//{{{ CSV格式文件导入数组 CSV_importData($file, $import_data, $warn_data...)
/**
* CSV格式文件导入数组
* 各种非CSV格式的文件
* @param $file string 文件路径
* @param $import_data array 成功导入的数组数据
* @param $warn_data array 格式有误导致失败的数组数据
* @param $showcsvnames string 是否包含数据的列名称,默认''不包含
* @param $null string 空字段代替符号,默认是NULL
* @param $add_character string 行终止的字符,默认是
* @param $separator string 分隔符,默认是,
* @param $enclosed string 包裹特殊字符用的字符,默认是"
* @param $escaped string 转义字段的字符,默认是
*
* @return bool EYCC_SUCCESS/EYCC_WARN_PARAM
*
* @access public
*/
function CSV_importData($file=null, &$import_data, &$warn_data, $showcsvnames='yes', $in_charset="UTF-8",
$out_charset="UTF-8", $separator=",", $enclosed=""", $escaped='\', $null=NULL)
{
//读取第一行为列名称,后面为内容为数据库内容
if ( !( $fd = fopen($file, 'r') ) || $showcsvnames != 'yes' )
{
return EYCC_WARN_PARAM;
}
$j = 0;//结果数组下标.
if ( 'yes' == $showcsvnames )
{
//第一行是列名
$flag_row_name = 1;
}else
{
$flag_row_name = 0;
}
while(!feof($fd))
{
$buff = fgets($fd, 4096);
if ( $in_charset != $out_charset )
{
$buff = iconv($in_charset, $out_charset, $buff);
}
$field_tmp = explode($separator, $buff);
//双引号的个数为奇数退出
$num_enclosed = substr_count($buff, $enclosed);
if ( 0 != $num_enclosed %2 )
{
$this->write_error($buff, EYCC_ERROR_CSV_FIELD, 'enclosed numbers is not double!', $warn_data);
return EYCC_ERROR_CSV_FIELD;
}
for($i=0; $iwrite_error($buff, EYCC_ERROR_CSV_FORMAT, 'rows name can not null!', $warn_data);
return EYCC_ERROR_FIELD_NULL;
}
// }}}
}
//如果不包含",则是一个普通串
if ( 0 == substr_count($field_tmp[$i], $enclosed) )
{
$import_data[$j][] = $field_tmp[$i];
}
else
{
//{{{ 如果包含"
//包含偶数个"
if (0 == substr_count($field_tmp[$i], $enclosed)%2)
{
$import = '';
if ( $enclosed == substr($field_tmp[$i], 0, 1) && $enclosed == substr($field_tmp[$i], -1))
{
//"abc"格式是允许的,转化成为数组的时候脱去"变成abc
$import = substr(substr($field_tmp[$i], 1, strlen($field_tmp[$i])-1),
0, strlen($field_tmp[$i])-2);
}
//""abc""转化成为"abc"
if ($import)
{
$import_data[$j][] = str_replace($enclosed. $enclosed, $enclosed, $import);
}
else
{
$import_data[$j][] = str_replace($enclosed. $enclosed, $enclosed, $field_tmp[$i]);
}
}
else if ( $enclosed == substr($field_tmp[$i], 0, 1))
{
// {{{ 第一个字符是" 说明这是一部分,需要合并后面串的内容
//去掉开始的一个" 添加,到末尾
//tmpstr最后形成一个完整的复杂数据内容
$tmpstr = substr($field_tmp[$i], 1, strlen($field_tmp[$i])-1);
$tmpstr .= $separator;
//查找以"结尾并且是奇数个"的数据
for ($k=$i+1; $kwrite_error($tmpstr, EYCC_ERROR_CSV_FORMAT,
'enclosed numbers is not double!', $warn_data);
if ($k>$i+1)
{
array_pop($import_data);
break;
}
}
}
//如果到了末尾仍然没有匹配到结束",报错
if ($k == count($field_tmp))
{
$this->write_error($buff, EYCC_ERROR_CSV_FIELD,
'enclosed numbers is not double!', $warn_data);
}
// end else }}}
}
else
{
//其他格式错误,包含单个包裹符,但是不再开头 结尾
$this->write_error($buff, EYCC_ERROR_CSV_FORMAT, 'enclosed place is error!', $warn_data);
}
//}}}
} //end else
}//end for
$flag_row_name = 0;
$j++;
}
fclose($fd);
array_pop($import_data);
return EYCC_SUCCESS;
}
//{{{ CSV格式文件导入数组 CSV_importData($file, $import_data, $warn_data...)
/**
* CSV格式文件导入数组
* 各种非CSV格式的文件
* @param $file string 文件路径
* @param $import_data array 成功导入的数组数据
* @param $warn_data array 格式有误导致失败的数组数据
* @param $showcsvnames string 是否包含数据的列名称,默认''不包含
* @param $null string 空字段代替符号,默认是NULL
* @param $add_character string 行终止的字符,默认是
* @param $separator string 分隔符,默认是,
* @param $enclosed string 包裹特殊字符用的字符,默认是"
* @param $escaped string 转义字段的字符,默认是
*
* @return bool EYCC_SUCCESS/EYCC_WARN_PARAM
*
* @access public
*/
function CSV_importData($file=null, &$import_data, &$warn_data, $showcsvnames='yes', $in_charset="UTF-8",
$out_charset="UTF-8", $separator=",", $enclosed=""", $escaped='\', $null=NULL)
{
//读取第一行为列名称,后面为内容为数据库内容
if ( !( $fd = fopen($file, 'r') ) || $showcsvnames != 'yes' )
{
return EYCC_WARN_PARAM;
}
$j = 0;//结果数组下标.
if ( 'yes' == $showcsvnames )
{
//第一行是列名
$flag_row_name = 1;
}else
{
$flag_row_name = 0;
}
while(!feof($fd))
{
$buff = fgets($fd, 4096);
if ( $in_charset != $out_charset )
{
$buff = iconv($in_charset, $out_charset, $buff);
}
$field_tmp = explode($separator, $buff);
//双引号的个数为奇数退出
$num_enclosed = substr_count($buff, $enclosed);
if ( 0 != $num_enclosed %2 )
{
$this->write_error($buff, EYCC_ERROR_CSV_FIELD, 'enclosed numbers is not double!', $warn_data);
return EYCC_ERROR_CSV_FIELD;
}
for($i=0; $iwrite_error($buff, EYCC_ERROR_CSV_FORMAT, 'rows name can not null!', $warn_data);
return EYCC_ERROR_FIELD_NULL;
}
// }}}
}
//如果不包含",则是一个普通串
if ( 0 == substr_count($field_tmp[$i], $enclosed) )
{
$import_data[$j][] = $field_tmp[$i];
}
else
{
//{{{ 如果包含"
//包含偶数个"
if (0 == substr_count($field_tmp[$i], $enclosed)%2)
{
$import = '';
if ( $enclosed == substr($field_tmp[$i], 0, 1) && $enclosed == substr($field_tmp[$i], -1))
{
//"abc"格式是允许的,转化成为数组的时候脱去"变成abc
$import = substr(substr($field_tmp[$i], 1, strlen($field_tmp[$i])-1),
0, strlen($field_tmp[$i])-2);
}
//""abc""转化成为"abc"
if ($import)
{
$import_data[$j][] = str_replace($enclosed. $enclosed, $enclosed, $import);
}
else
{
$import_data[$j][] = str_replace($enclosed. $enclosed, $enclosed, $field_tmp[$i]);
}
}
else if ( $enclosed == substr($field_tmp[$i], 0, 1))
{
// {{{ 第一个字符是" 说明这是一部分,需要合并后面串的内容
//去掉开始的一个" 添加,到末尾
//tmpstr最后形成一个完整的复杂数据内容
$tmpstr = substr($field_tmp[$i], 1, strlen($field_tmp[$i])-1);
$tmpstr .= $separator;
//查找以"结尾并且是奇数个"的数据
for ($k=$i+1; $kwrite_error($tmpstr, EYCC_ERROR_CSV_FORMAT,
'enclosed numbers is not double!', $warn_data);
if ($k>$i+1)
{
array_pop($import_data);
break;
}
}
}
//如果到了末尾仍然没有匹配到结束",报错
if ($k == count($field_tmp))
{
$this->write_error($buff, EYCC_ERROR_CSV_FIELD,
'enclosed numbers is not double!', $warn_data);
}
// end else }}}
}
else
{
//其他格式错误,包含单个包裹符,但是不再开头 结尾
$this->write_error($buff, EYCC_ERROR_CSV_FORMAT, 'enclosed place is error!', $warn_data);
}
//}}}
} //end else
}//end for
$flag_row_name = 0;
$j++;
}
fclose($fd);
array_pop($import_data);
return EYCC_SUCCESS;
}
相关阅读 更多 +