0

我在 Mysql 中创建了一个带有表名(CSV 文件名)和字段名(CSV 列名)的数据结构。

现在我正在成功地将数据从 csv 导入到 Mysql 表中,因为我在脚本中硬编码 csv 文件名和字段名。如何动态获取因为我有许多 csv 文件要导入 mysql。

<?php
include "db.php";
$filename = "C:\REQ\Status.csv";
if (($handle = fopen($filename, 'r')) !== FALSE)
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
     {
       print_r($data);
       $import="INSERT into status(status) values('$data[1]')";
       mysql_query($import) or die(mysql_error());

     }
 fclose($handle);

?>    
4

4 回答 4

1

我已经实现了这段代码,它是经过测试的代码。我认为这是非常充分的

您必须遵循一些规则:-

1.你的csv文件根据数据库表名(例如:db表名是users然后csv应该是users.csv)

2.您的 csv 文件的第一行应该是 db 表字段名称(例如:ID、名称等),然后开始您的数据输入

3.您可以从以下位置下载数据源类:- http://code.google.com/p/php-csv-parser/ 因为我在代码下面有要求:require_once 'CSV/DataSource.php';

<?php
ini_set('memory_limit','512M');
$dbhost = "localhost";
$dbname = "excel_import";
$dbuser = "root";
$dbpass = "";

$conn=mysql_connect ($dbhost, $dbuser, $dbpass) or die ("I cannot connect to the database because: " . mysql_error());
mysql_select_db($dbname) or die("Unable to select database because: " . mysql_error());


require_once 'CSV/DataSource.php';


$filename = "users.csv";
$ext = explode(".",$filename);
$path = "uploads/".$filename;

$dbtable = $ext[0];

import_csv($dbtable, $path);


function import_csv($dbtable, $csv_file_name_with_path)
{
    $csv = new File_CSV_DataSource;
    $csv->load($csv_file_name_with_path);

    $csvData = $csv->connect();

    $res='';
    foreach($csvData  as $key)
    {
        $myKey ='';
        $myVal='';
        foreach($key as $k=>$v)
        {
            $myKey .=$k.',';
            $myVal .="'".$v."',";
          }

        $myKey = substr($myKey, 0, -1);
        $myVal = substr($myVal, 0, -1); 
        $query="insert into ".$dbtable." ($myKey)values($myVal)";
        $res=  mysql_query($query);

    }

    if($res ==1)
    {

                echo "record successfully Import.";

    }else{

                echo "record not successfully Import.";
    }
}
于 2012-08-04T17:57:43.477 回答
0

像这样的东西:

function integrate($filename)
{
if (($handle = fopen($filename, 'r')) !== FALSE)
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
     {
       print_r($data);
       $import="INSERT into status(status) values('$data[1]')";
       mysql_query($import) or die(mysql_error());

     }
 fclose($handle);
}


$files = scandir('folder/');
foreach($files as $file) {
  //pre-checking (if already integrated, if CSV etc..)
  integrate($file);
}
于 2012-08-04T17:32:52.060 回答
0

如果您将其作为 PHP 脚本运行,则可以将文件名作为参数获取,但$argv[1]您需要检查文件是否存在。

于 2012-08-04T17:36:00.333 回答
0

如果文件名和表名匹配,那么无论您在哪里输入或检索文件名,都可以在查询中使用相同的值:

$filename = "Status";

$table_name = strtolower( $filename );

$filename = "C:\REQ\{$filename}.csv";

if (($handle = fopen($filename, 'r')) !== FALSE)
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
     {
       print_r($data);
       $import="INSERT into {$table_name}(status) values('$data[1]')";

对于列名,我建议将它们放在 CSV 文件的第一行并从那里解析它们,例如:

if (($handle = fopen($filename, 'r')) !== FALSE)

    $columns = fgets($handle, 1000);

     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
     {
       print_r($data);
       $import="INSERT into {$table_name}({$columns}) values('{$data[1]}')";

我还建议考虑为多行 INSERT 构建单个 SQL 查询字符串。例如

$values = array();

     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
     {
       print_r($data);
       $values[] = "('{$data[1]}')";
       ...
     }

     $values = join( ",\n\n", $values );

     $insert = "INSERT into {$table_name}({$columns}) values {$values}";
于 2012-08-04T17:37:44.833 回答