php - 使用 PHP/MySQL 导入 CSV 数据

标签 php mysql database csv import

我在尝试从 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. 在整个过程中数据格式是否发生了变化,还是可以在图表中使用?例如小数一旦放入数据库中会一直保持小数吗?

我认为这涵盖了所有内容,在此先感谢您的帮助!

编辑:

刚做了10000条记录上传测试,报错:

“ fatal error :超过 30 秒的最大执行时间”

有什么想法吗?

最佳答案

前几天我回答了一个几乎相同的问题:Save CSV files into mysql database

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

简单示例:

<?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

希望有帮助

关于php - 使用 PHP/MySQL 导入 CSV 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11448307/

相关文章:

php - 执行cUrl请求

php - 远程传输异常 : When partially updating elasticsearch document using script

MYSQL 存储过程不更新列

database - 如何以 dd-mm-yyyy 格式从 sqlite 数据库中选择两个日期之间的数据?

database - 拆分 Access 数据库而不能创建唯一的 fe

php - PDO 中的 Postgresql 插入

php - 将值从一个表插入到另一个表

Java 将 ISO-8859-1 转换为具有正确 unicode 字符的 UTF-8

mysql - 如何在 MySQL 右连接中对结果进行排序?

java - RealmTransactions IDE 编辑器错误 : Expected Identifier