将CSV文件保存到MySQL数据库中

4
我有很多csv文件在一个目录中。对于这些文件,我需要编写一个脚本将它们的内容放入我的数据库的正确字段和表格中。我几乎是php语言的初学者:我在互联网上找到了一些代码片段。它似乎可以工作,但我卡在了一个阶段。有些主题与此网站有关,但我没有找到ecat问题的解决方法。
我编写了一个PHP脚本,可以获取这些文件的路径和名称。我还成功创建了一个表,其名称取决于每个CSV(例如:文件“data_1.csv”在mysql中给出数据_1.csv表)。所有表都具有相同的三个字段:id,url,value。 最后要做的是通过读取每个文件并将用“|”字符分隔的值放入正确的表格中来填充这些表。例如,如果“data_1.csv”的一行是
8756 | htttp://example.com | something written
我希望在data_1.csv表中得到一个记录,其中8756在ID中,htttp://example.com在URL字段中,something written在值字段中。 我找到了使用fcsvget函数读取和打印这些csv的方法。但我不知道如何将这些行放入SQL数据库中。有人能在这一点上帮助我吗?
以下是我的脚本
<?php 
ini_set('max_execution_time', 300); 
$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = ''; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass, true) or die                      ('Error connecting to mysql'); 
$dbname = 'test_database'; 

mysql_select_db($dbname); 


$bdd = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
if (mysqli_connect_errno()) { 
printf("Connect failed: %s\n", mysqli_connect_error()); 
exit(); 
} 
else { 
echo "hello <br>"; 
} 

$dir = 'C:\wamp\www\test';
$imgs = array();

if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
    if (!is_dir($file) && preg_match("/\.(csv)$/", $file)) {
        array_push($imgs, $file);
        }
    }

    closedir($dh);
} else {
    die('cannot open ' . $dir);
}
foreach ($imgs as $idx=>$img) {
    $class = ($idx == count($imgs) - 1 ? ' class="last"' : '');
    $filePath=$dir . '\\'. $img;
    $file = fopen($filePath, "r") or exit("Unable to open file!"); 
    $nom = 'FILE: ' . $dir . '\\'. $img;
    echo $nom;
    settype($nom, "string");
    echo '<br>';
    $chemin = '<img src="' . $dir . $img . '" alt="' . 
        $img . '"' . $class . ' />' . "\n";
    echo $chemin;
    $file_name =  basename($filePath);
    $sql = 'CREATE TABLE `' . $file_name . '` (id int(20000), url varchar(15), value TEXT)';
    mysql_query($sql,$conn);
    $handle = fopen($filePath, 'r');
    while (($row = fgetcsv($handle)) !== false) {
    foreach ($row as $field) {
    echo $field . '<br />';
}
}
fclose($handle);

}

echo ("VERIFY"); 
for ($i = 1; $i <= 1682; $i++) { 
    echo ("<br>A : " . $i); 
    $checkRequest= "select * from movies where movieID='". $i."'"; 
    echo ("<br>". $checkRequest); 
    if ($result = $mysqli->query($checkRequest)) { 
    printf("<br> Select ". $i ."returned %d rows.\n", $result->num_rows); 
    if ($result->num_rows == 0) { 

                    echo ("I : " . $i); 
            } 



$result->close(); 
    } 
} 

$mysqli->close(); 

?> 

4
请不要在新的代码中使用 mysql_* 函数。它们已经不再维护,社区已经开始了废弃过程。看到红框了吗?相反,您应该学习有关prepared statements,并使用 PDOMySQLi 中的任一种。如果您无法决定,这篇文章将有助于选择。如果您有兴趣学习,这里是一个很好的PDO教程 - Madara's Ghost
3个回答

12

MySQL提供一个很棒的功能,可以在单个查询中直接导入CSV文件。

你需要查找的SQL命令是LOAD DATA INFILE

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

快速示例:

LOAD DATA INFILE 'fileName'
 INTO TABLE tableName
 FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\n'
(
field1,
field2,
field3,
@variable1,
@variable2,
etc
)
set
(
field4 = concat(@variable1,@variable2)
);

这是一个相当基础的例子,但它涵盖了大多数你想要的东西。手册页面提供了如何处理一些非常复杂的东西的详细信息。

希望能有所帮助。


LOAD DATA INFILE本身可以工作,但我有很多文件需要嵌入到我的php脚本中。我尝试添加代码,但是行没有添加到我的数据库中。但也许我应该开一个新主题?:$sqltwo = "LOAD DATA LOCAL INFILE '$filePath' INTO TABLE $file_name FIELDS TERMINATED BY '|' ESCAPED BY '\' LINES STARTING BY '' TERMINATED BY '\n'(id, url, value)" or die(mysql_error()); - user1474018
LOAD DATA LOCAL INFILE ==> 使用SQL用户权限相对于SQL服务器读取$filePathLOAD DATA INFILE(不带LOCAL)==> 使用PHP用户权限相对于PHP程序读取$filePath。 它的效果很好:我有一个PHP程序使用LOAD DATA INFILE定期导入30万行数据文件。比通过PHP读取要快得多。但是,如果您仍然遇到LOAD DATA INFILE的特定问题,则新问题可能比在此答案上再发表20条评论更容易。 :-) - SDC

0

之后

foreach ($row as $field) {
echo $field . '<br />'; 

你需要解析分号后面的结果,例如:;
$pieces = explode(";", $field);

然后将每个部分插入到数据库中

$sql = ' INSERT INTO X VALUES ("'.$pieces[0].'","'.$pieces[1].'","'.$pieces[2].'","'.$pieces[3].'","'.$pieces[4].'")';
mysql_query($sql, $conn);

0

同时也可以使用mysqlimport

private function runImport($host, $username, $password, $schema, $csvFilePath) {
    $output = array();
    $cmd = "/usr/bin/mysqlimport --host=$host";
    $cmd .= ' --fields-terminated-by=\',\'  --fields-optionally-enclosed-by=\'"\' ';
    $cmd .= ' --user=' . $username . ' --password='. $password;
    $cmd .= " $schema $csvFilePath";

    exec($cmd, $output, $retVal);

    foreach ($output as $line) {
       echo "$line\n";
    }

    echo "\n\nReturn code : $retVal";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接