免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2648 | 回复: 0
打印 上一主题 下一主题

csv导入函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-16 13:42 |只看该作者 |倒序浏览
将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;
   
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/476/showart_61808.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP