文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>csv导入函数

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;
   
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载