首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用PHP/MySQL导入CSV数据

使用PHP/MySQL导入CSV数据
EN

Stack Overflow用户
提问于 2012-07-12 16:58:52
回答 6查看 167.4K关注 0票数 33

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

首先,这是我的代码,用来帮助理解问题(稍微整理一下,删除CSS和DB连接):

代码语言:javascript
复制
<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条上传记录的测试,得到了错误:

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

有什么想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-12 18:02:01

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

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

简单的例子:

代码语言:javascript
复制
<?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

希望这能有所帮助

票数 77
EN

Stack Overflow用户

发布于 2012-07-12 17:01:07

代码语言:javascript
复制
$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;
}
票数 7
EN

Stack Overflow用户

发布于 2012-07-12 17:12:27

假设$infile = a.csv //需要导入文件。

代码语言:javascript
复制
class blah
{
 static public function readJobsFromFile($file)
{            
    if (($handle = fopen($file, "r")) === FALSE) 
    {
        echo "readJobsFromFile: Failed to open file [$file]\n";
        die;
    }

    $header=true;
    $index=0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
        // ignore header
        if ($header == true)
        {
            $header = false;
            continue;
        }

        if ($data[0] == '' && $data[1] == '' ) //u have oly 2 fields
        {
            echo "readJobsFromFile: No more input entries\n";
            break;                        
        }            


        $a      = trim($data[0]);
        $b   = trim($data[1]);                 





        if (check_if_exists("SELECT count(*) FROM Db_table WHERE a='$a' AND b='$b'") === true)
        {

                $index++;
            continue;    
        }            

        $sql = "INSERT INTO DB_table SET a='$a' , b='$b' ";
        @mysql_query($sql) or die("readJobsFromFile: " . mysql_error());            
        $index++;
    }

    fclose($handle);        
    return $index; //no. of fields in database.
} 
function
check_if_exists($sql)
{
$result = mysql_query($sql) or die("$sql --" . mysql_error());
if (!$result) {
    $message  = 'check_if_exists::Invalid query: ' . mysql_error() . "\n";
    $message .= 'Query: ' . $sql;
    die($message);
}

$row = mysql_fetch_assoc ($result);
$count = $row['count(*)'];
if ($count > 0)
    return true;
return false;
}

$infile=a.csv; 
blah::readJobsFromFile($infile);
}

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11448307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档