如何从PHP中的CSV文件中排除列标题?

时间:2013-07-15 09:28:49

标签: php mysql csv

当我的客户将他们的输入提供给Excel文件时,他们需要列标题。但是当他们将文件导出为CSV(.csv)时,它会将列标题包含在其中。那是问题。

+---------+--------+-------------+
| Post id |  Name  | Designation |
+---------+--------+-------------+
    101     noYon      designer
    102     nakib     accountant
    103     nishi      developer
+---------+--------+-------------+

在我的CSV(以逗号分隔)中,我得到了:

Post id,Name,Designation
101,noYon,designer
102,nakib,accountant
103,nishi,developer

我需要在使用PHP将其上传到MySQL时从CSV中排除列标题(第一行)。

有什么办法吗?

3 个答案:

答案 0 :(得分:1)

This article This forum thread 的帮助下,在我的同事Tahmina Aktar女士的亲身帮助下,我找到了一个可行的解决方案西。希望它会帮助任何人尝试这样的事情:

        //get the csv file
        $file = $_FILES[csv][tmp_name];
        $handle = fopen($file,"r"); // read the file
        ?>

        <?php
        // make the loop and do upload

        $find_header = 0; // a simple counter

        while( $data = fgetcsv( $handle,6000,",","'") ) {
            $find_header++; //update counter

            if( $find_header > 1 ) {
                $sql = mysql_query( "INSERT INTO table_name (
                        post_id,
                        name,
                        designation
                    )
                    VALUES
                    (
                        '".$data[0] ."',
                        '".$data[1] ."'
                        '".$data[2]."'
                    )
                ");
            }
        } // endwhile

逻辑很简单,有点幼稚。如果我们知道fgetcsv()的工作原理。 fgetcsv()是:

  

fgetcsv()函数从打开的文件中解析一行,检查CSV字段。

     

fgetcsv()函数停止在新行,指定长度或EOF(以先到者为准)返回。

这意味着每次循环播放时它都会获取CSV的每一行。因此,如果我们传递一个简单的PHP计数器并排除第一行,那就很简单了。

当然,不要忘记使用PHP清理函数(例如trim()addslashes()等)来清理数据。)

您可以获取我的一大堆代码 HERE

答案 1 :(得分:1)

一个简单的解决方案:读取第一行并丢弃它,然后在循环中逐行读取文件的其余部分:

//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");
fgetcsv($handle);  // Discard first line. If we know the maximum line length
                   // add it as second argument: it's slightly faster 

while( $data = fgetcsv( $handle) ) {
   $query = mysqli->query( "INSERT INTO table (post_id,name,designation) VALUES ('". 
                implode($data,"','")."'"; 
} 

我在此处未编写的更快的解决方案:将多组值附加到INSERT,如下所示:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

答案 2 :(得分:0)

$filename = $_FILES["file"]["tmp_name"];
if ($_FILES["file"]["size"] > 0){
    $file = fopen($filename, "r");
    fgetcsv($file);
    while (($getData = fgetcsv($file, 10000, ",")) !== false){
        echo "<pre>";
        print_r($getData);
        echo "</pre>";
    }

    fclose($file);
}