2017-02-09 20 views
2

申し訳ありませんこれまでに質問されている場合は申し訳ありませんが、SEではここのケースに関連するものは見つかりませんでした。PHP - 自動増分ID付きのCSVインポート

CSVファイルをCSVファイルにインポートしようとしていますが、テーブルの列番号IDがCSVファイルにないことを除いて、CSVファイルはCSVファイルと同じ量と順序でCSVファイルにインポートしようとしています。

私が達成したいのは、各レコードで自動的に増加する数字IDを生成しながら、CSVをテーブルにインポートすることです。 CSVは常にテーブルの最初の列にデータを挿入するように見えるので、これは可能ではないようですが、私の場合は2列目にする必要があります。

私はこれにどのようにアプローチし、勉強できる参考コードはありますか?私は現在、このPDOアプローチを取り組んでいますが、上記の困難を抱えています。

PHP

<?php 
$databasehost = "localhost"; 
$databasename = "test"; 
$databasetable = "sample"; 
$databaseusername="test"; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n"; 
$csvfile = "filename.csv"; 

if(!file_exists($csvfile)) { 
    die("File not found. Make sure you specified the correct path."); 
} 

try { 
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", 
     $databaseusername, $databasepassword, 
     array(
      PDO::MYSQL_ATTR_LOCAL_INFILE => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ) 
    ); 
} catch (PDOException $e) { 
    die("database connection failed: ".$e->getMessage()); 
} 

$affectedRows = $pdo->exec(" 
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` 
     FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." 
     LINES TERMINATED BY ".$pdo->quote($lineseparator)); 

echo "Loaded a total of $affectedRows records from this csv file.\n"; 

?> 

+0

phpMyAdminを使用していますか? –

+0

私はCronJob経由でPHPベースでこれを行う必要があります。しかし、私はphpMyAdminを利用できます。 – Armitage2k

+0

これまでのコードを表示できますか? – LBA

答えて

2

インポート時に特定のカラムのためのMySQLの設定値を持つことができ、ありがとうございました。 idフィールドがauto incrementに設定されている場合は、インポート中にnullに設定すると、MySQLはその値に増分値を割り当てます。

LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` 
    FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." 
    LINES TERMINATED BY ".$pdo->quote($lineseparator))." 
    SET id=null; 

EDITは - 場合ID列が

COL1、COL2、COL3、...(idカラムなし)DBテーブル内の実際の列の名前であるCSV

に存在しません
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` 
    FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." 
    LINES TERMINATED BY ".$pdo->quote($lineseparator))." 
    (col1, col2, col3,...) 
    SET id=null; 
+0

の両方で使用できます。つまり、CSVの最初の列はID列でなければなりません。 – Armitage2k

+0

がid列のデータがCSVファイルでない場合に更新されました –

+0

素晴らしいです、ありがとうございます。ちょうど興味があります、これは実際にMySQLかMySQLiですか? – Armitage2k

0

AUTO_INCREMENT属性を使用して、新しい行の一意のIDを生成できます。 mysqlとenginのほとんどのバージョンがこれをサポートしています。あなたはIDについて心配する必要はなく、必要なフィールドを挿入するためにcronジョブを使用することができ、AUTO_INCREMENTはID自体を処理します。 AUTO_INCREMENTカラムに値が指定されていないため、MySQLはシーケンス番号を自動的に割り当てます。また、NO_AUTO_VALUE_ON_ZERO SQLモードが有効でない限り、列に明示的に0を割り当ててシーケンス番号を生成することもできます。列がNOT NULLと宣言されている場合は、NULLを列に割り当てて順序番号を生成することもできます。 AUTO_INCREMENT列に他の値を挿入すると、列はその値に設定され、次の自動的に生成された値が最大列値から順に続くように順序がリセットされます。

最新の自動生成されたAUTO_INCREMENT値は、LAST_INSERT_ID()SQL関数またはmysql_insert_id()C API関数を使用して取得できます。これらの関数は接続固有であるため、戻り値は挿入を実行する別の接続の影響を受けません。

公式リンクから例を参照してください。 [https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html]

0

あなたは何度もテーブルを再作成したいとCSVからのデータを操作するように、この方法を試してください。

// You have to create the TABLE if not exists 
$pdo->exec("TRUNCATE TABLE sample"); // No need to drop the table if columns don't change. 

$csvContent = file_get_contents($csvfile); // Raw Data from file 

$lines = explode(" 
", $csvContent); // The standard line separator is an ENTER 

// Now you have each line separated 
for($i = 0; $i < coount($lines); $i++) { 
    $col = explode(";", $lines[$i]); // Would be a comma 

    // Now you have each column separated 
    $pdo->exec("INSERT INTO sample (id, col1, col2, col3 ... coln) VALUES (NULL, '".$col[0]."', '".$col[1]."', '".$col[2]."' ... '".$col[n]."')"); 
} 

この方法で、あなたあなたのデータを掘り下げて、AUTO_INCREMENT IDを設定するだけでなく、CSVからのものを検証し、インポートエラーを修正/防止することができます。