0

テーブル名 (CSV ファイル名) とフィールド名 (CSV 列名) を使用して、Mysql にデータ構造を作成しました。

現在、csv から Mysql テーブルにデータを正常にインポートしていますが、スクリプトで csv ファイル名とフィールド名をハードコーディングしています。mysqlにインポートするcsvファイルがたくさんあるため、動的フェッチする方法。

<?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があるため:

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

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 に答える
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 に答える