使用PHP/MySQL导入CSV数据

zvms9eto  于 2022-12-25  发布在  PHP
关注(0)|答案(6)|浏览(144)

我在尝试从CSV导入数据时遇到了一点问题,还有几个问题我还没有解决。
首先,这里是我的代码,以帮助把事情的Angular (整理了一下,删除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在每个字段,我不知道为什么
1.我一直读到数据最终被括在""中,如果发生这种情况,我将如何排序?
1.我怎样才能忽略头等CSV的前X行?
1.数据格式在整个过程中是否发生了变化,或者是否已准备好用于图表中?例如,小数一旦放入数据库中,是否仍将保持小数?
编辑:
刚刚完成了10,000条记录上传的测试,出现错误:
"致命错误:超过了30秒的最大执行时间"
有什么想法吗?

nwo49xxi

nwo49xxi1#

前几天我回答了一个几乎相同的问题: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
希望能有所帮助

kt06eoxx

kt06eoxx2#

$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;
}
hk8txs48

hk8txs483#

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

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);
}

希望这个能帮上忙。

zaq34kh6

zaq34kh64#

set_time_limit(10000);

$con = mysql_connect('127.0.0.1','root','password');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$fp = fopen("file.csv", "r");

while( !feof($fp) ) {
  if( !$line = fgetcsv($fp, 1000, ';', '"')) {
     continue;
  }

    $importSQL = "INSERT INTO table_name VALUES('".$line[0]."','".$line[1]."','".$line[2]."')";

    mysql_query($importSQL) or die(mysql_error());  

}

fclose($fp);
mysql_close($con);
wa7juj8i

wa7juj8i5#

我认为解析csv时要记住的主要事情是它遵循一些简单的规则:
a)它是一个文本文件,因此很容易打开B)每行由行尾确定\n因此首先将字符串拆分为行c)每行/行具有由逗号确定的列,因此按逗号拆分每行以获得列数组
have a read of this post看看我在说什么
一旦你掌握了窍门,它实际上是非常容易做到的,而且会变得非常有用。

fdbelqdn

fdbelqdn6#

数据库连接:

try {
        $conn = mysqli_connect($servername, $username, $password, $db);
        //echo "Connected successfully"; 
    } catch (exception $e) {
        echo "Connection failed: " . $e->getMessage();
    }

读取CSV文件并上传到数据库表的代码。

$file = fopen($filename, "r");
            while (($getData = fgetcsv($file, 10000, ",")) !== FALSE) {
                $sql = "INSERT into db_table 
                   values ('','" . $getData[1] . "','" . $getData[2] . "','" . $getData[3] . "','" . $getData[4] . "','" . $getData[5] . "','" . $getData[6] . "')";
                $result = mysqli_query($conn, $sql);
                if (!isset($result)) {
                    echo "<script type=\"text/javascript\">
                            alert(\"Invalid File:Please Upload CSV File. 
                            window.location = \"home.do\"
                          </script>";
                } else {
                    echo "<script type=\"text/javascript\">
                        alert(\"CSV File has been successfully Imported.\");
                        window.location = \"home.do\"
                    </script>";
                }
            }
            fclose($file);

相关问题