使用 PHP/MySQL 导入 CSV 数据

2022-08-30 13:50:07

我在尝试从CSV导入数据时遇到了一些问题,并且有几个问题,我还没有设法解决自己。

首先,这是我的代码,以帮助正确看待事物(整理了一下,删除了CSS和DB连接):

<body>
<div id="container">
<div id="form">

<?php
$deleterecords = "TRUNCATE TABLE tablename"; //empty the table of its current records
mysql_query($deleterecords);

//Upload File
if (isset($_POST['submit'])) {

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
        echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded 
 successfully." . "</h1>";
        echo "<h2>Displaying contents:</h2>";
        readfile($_FILES['filename']['tmp_name']);
    }

    //Import uploaded file to Database
    $handle = fopen($_FILES['filename']['tmp_name'], "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $import="INSERT into importing(text,number)values('$data[0]','$data[1]')";

        mysql_query($import) or die(mysql_error());
    }

    fclose($handle);

    print "Import done";

//view upload form
} else {

    print "Upload new csv by browsing to file and clicking on Upload<br />\n";

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>";

    print "File name to import:<br />\n";

    print "<input size='50' type='file' name='filename'><br />\n";

    print "<input type='submit' name='submit' value='Upload'></form>";

}

?>

</div>
</div>
</body>

它基本上是我对一个例子的改编,我在对各种方法进行了多次尝试后发现。

我的CSV有两列数据,第一列是文本,第二列是整数 数据库中的表也有两列,第一列称为“文本”,第二列称为“数字”

所以我的问题是:

  1. 正在上传的文本在每个字段中都显示为0,我不确定为什么
  2. 我一直在阅读有关最终包含在“”中的数据,如果发生这种情况,我将如何对其进行排序?
  3. 我怎么能忽略CSV的前X行的标题等?
  4. 数据格式是否在整个过程中发生了变化,或者它是否准备好让我在图表中使用?例如,一旦放入数据库中,小数会保持为小数吗?

我认为这涵盖了一切,提前感谢任何帮助!

编辑:

刚刚完成了10,000条记录上传的测试,并得到了错误:

“致命错误: 超出 30 秒的最长执行时间”

有什么想法吗?


答案 1

就在前几天,我回答了一个几乎相同的问题:将CSV文件保存到mysql数据库中

MySQL有一个功能,它允许它直接在单个SQL查询中导入CSV文件,而不需要通过PHP程序在循环中处理它。LOAD DATA INFILE

简单示例:

<?php
$query = <<<eof
    LOAD DATA INFILE '$fileName'
     INTO TABLE tableName
     FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\n'
    (field1,field2,field3,etc)
eof;

$db->query($query);
?>

就这么简单。

没有循环,没有大惊小怪。而且比在PHP中解析它要快得多

MySQL手册页面在这里:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

希望有所帮助


答案 2
$i=0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i>0){
    $import="INSERT into importing(text,number)values('".$data[0]."','".$data[1]."')";
    mysql_query($import) or die(mysql_error());
}
$i=1;
}

推荐