【问题标题】:skip row 0 in CSV import在 CSV 导入中跳过第 0 行
【发布时间】:2013-06-28 00:22:19
【问题描述】:

所以我将 CSV 文件上传到我的 mysql 数据库,我希望它始终跳过第一行,即第 0 行,其中包含列名

我使用的当前代码

    //connect to the database 
    $connect = mysql_connect("localhost","username","password"); 
    mysql_select_db("mydatabase",$connect); //select the table 
    // 

    if ($_FILES[csv][size] > 0) { 

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

        //loop through the csv file and insert into database 
        do { 
            if ($data[0]) { 
                mysql_query("INSERT INTO contacts (contact_first, contact_last, contact_email) VALUES 
                    ( 
                        '".addslashes($data[0])."', 
                        '".addslashes($data[1])."', 
                        '".addslashes($data[2])."' 
                    ) 
                "); 
            } 
        } while ($data = fgetcsv($handle,1000,",","'")); 
        // 

        //redirect 
        header('Location: import.php?success=1'); die; 

} 

我需要删除以下行 来源、名字、姓氏、电话 1、电话 2、联系电子邮件、职务、参考编号、日期、状态

我本来打算只做一个if($data[0]=="Source") 但问题是如果他们更改了 CSV 文件的布局或其他东西。

所以我的问题很简单,我们可以跳过第 0 行吗?

但如果第 0 行的第一件事不是 Source,我可以收到警报以便查看 CSV 文件吗?

【问题讨论】:

  • 放一个变量来跟踪迭代,如果它是0或者未定义就不要运行插入查询。
  • LOAD DATA INFILE 比你的方法容易得多,速度也快得多,而且它有一个跳过第一行的设置
  • 如果文件布局发生了变化,那么无论如何您都需要重新访问此代码。除非您对可能发生的事情有清楚的了解,否则我不会在这里担心。

标签: php mysql csv upload


【解决方案1】:

您可能有兴趣尝试使用LOAD DATA INFILE

LOAD DATA INFILE '/path/to/your/file.csv' 
INTO TABLE contacts 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

【讨论】:

    【解决方案2】:

    读取文件的第一行,如果是标题行则丢弃:

        $file = $_FILES[csv][tmp_name]; 
        $handle = fopen($file,"r"); 
    
        // read the first line
        $data = fgetcsv($handle,1000,",","'")
        // if the first line is a header, discard it and read the next
        if ($data[0] == "Source:") {
           $data = fgetcsv($handle,1000,",","'")
        }
    
        //loop through the csv file and insert into database 
        do { 
            if ($data[0]) { 
                mysql_query("INSERT INTO contacts (contact_first, contact_last, contact_email) VALUES 
                    ( 
                        '".addslashes($data[0])."', 
                        '".addslashes($data[1])."', 
                        '".addslashes($data[2])."' 
                    ) 
                "); 
            } 
        } while ($data = fgetcsv($handle,1000,",","'")); 
        // 
    

    顺便说一句,您的 do...while 循环与您最初的方式不同。在阅读数据之前,您正在查看数据。有了我添加的预读,它应该可以工作。

    【讨论】:

      【解决方案3】:

      在 fopen 之后,我会调用 fgets($handle); 并忽略返回值,从而跳过第一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-21
        • 2016-08-30
        • 2020-11-25
        • 2013-04-08
        • 1970-01-01
        • 2014-07-29
        • 2014-01-05
        相关资源
        最近更新 更多