2017-02-09 108 views
2

對不起,如果這之前已經問過,但我無法找到任何東西會涉及我在這裏的情況下SE。PHP - CSV導入自動增加ID

我想導入一個CSV文件到我的Mysql數據庫表中,這兩個表的CSV具有完全相同的數量和順序的列,但表格的列ID在CSV文件中沒有丟失。

我想要實現的是將CSV導入到表中,同時生成一個隨每條記錄自動增加的ID數字。這似乎不可能,因爲CSV似乎總是希望將其數據插入表中的第一列,但在我的情況下,我需要它成爲第二列。

我該如何解決這個問題,是否有我可以學習的任何參考代碼?我目前正在處理這種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字段設置爲自動增量,則可以在導入期間將其設置爲空,然後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; 

編輯 - 萬一ID列中不存在CSV

的COL1,COL2,COL3,...是在DB表實際的列名(沒有ID列)

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屬性可用於爲新行生成唯一標識。大多數版本的mysql和engin都支持這一點。您不必擔心該ID,並可以使用cron作業來插入所需的字段,而AUTO_INCREMENT將處理該ID本身。 沒有爲AUTO_INCREMENT列指定值,所以MySQL自動分配序列號。除非啓用NO_AUTO_VALUE_ON_ZERO SQL模式,否則您還可以顯式地將0賦給列以生成序列號。如果該列被聲明爲NOT NULL,那麼也可以將NULL分配給該列以生成序列號。將任何其他值插入AUTO_INCREMENT列時,該列將設置爲該值,並重置序列,以便下一個自動生成的值從最大列值開始依次跟隨。

您可以使用LAST_INSERT_ID()SQL函數或mysql_insert_id()C API函數檢索最近自動生成的AUTO_INCREMENT值。這些函數是特定於連接的,所以它們的返回值不受另一個也在執行插入的連接的影響。

見例如,從官方鏈接: [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的內容,並可以糾正/防止導入錯誤。