$file = fopen("1.csv","r");$title=array();
$data=array();
$i=0;
while(!feof($file))
{
if($i==1)
{
$content=fgetcsv($file);
for($j=0;$j<count($title);$j++)
{
$key=$title[$j];
$value=$content[$j];
$data[$key]=$value;
}
                //此处省略掉将数组$data内数据写入数据库的语句。
}
else
{
$title=fgetcsv($file);
$i=1;
}

}
fclose($file);

解决方案 »

  1.   

    用这段代码读取CSV后面会多一条空记录,应该是多循环了一次,请问哪里出错误了
      

  2.   

    你的csv多了一行空记录,看看吧最后一行的回车去掉
      

  3.   

    将csv读进一个数据, 过滤一下, 以免不必要的的东西也混进数据库就不好
      

  4.   

    得到数据var_dump(trim())化空格。。
      

  5.   

    把CSV转换成UTF-8格式的,或者将CSV导到Access里,再连接到Access读取插入!
      

  6.   

    转换下CSV为UTF-8编码格式试下!
      

  7.   

    还没有验证转换UTF-8是否可以,我解决的办法是把数组遍历一遍,把所有空记录unset()掉了。现把我的思路写下大家交流下算法可能比较糟糕,是先把所有数据都放到一个二维数组里面,然后遍历这个二维数组的。循环里面嵌套了一层循环(写数据库的时候是读一行CSV写一行入数据库的,没有放到一个二维数组里,不过思路是大同小异的)。不过目前我的水平仅限于想到这个可行方法,呵呵。相应代码:$k=-1;
    $titlekey='';...省略掉读取文件给$data赋值的语句,这里给$titlekey赋值,内容是任意的一个‘key’$count=count($data[$titlekey]);//任取一列进行分析,for($j=0;$j<$count;$j++)
    {
    if($data[$titlekey][$j]=='') //如果某列中有空值,将该空值对应的key记录到$k中
    {
    $k=$j;
    }
    if($k!=-1)
    {
    for($j1=0;$j1<count($title);$j1++)
    {
    $key=$title[$j1];
    if($data[$key][$k]!='')
    {
    $k=-1;
    }
    }
    if($k!=-1)//如果每一列的该行都为空,就把这一行所有的信息从对应的数组项中删掉
    {
    for($j1=0;$j1<count($title);$j1++)
    {
    $key=$title[$j1];
    unset($data[$key][$k]);
    }
    }
    }
    }
      

  8.   

    不必那么麻烦while($buf = fgetcsv($fp)) {
      if(trim(join('',$buf))) {
        这里是正常的入库操作
      }
    }
      

  9.   

    多谢9楼的代码,又看到了这样一种写法,同8楼朋友的思路,比我那个好多了while(!feof($handle_csv)) {
    $fields = fgetcsv($handle_csv, 1024);
    if($fields === false){
    break;
    }
    if($fields[0] === ""){
    continue;
    }
    $data[] = $fields;