2017-02-09 4 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

Мне нужно сделать это на PHP основе CronJob. Но у меня есть 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; 

РЕДАКТИРОВАТЬ - В случае, если столбец идентификатора нет в CSV

col1, col2, col3, ... имена реальных столбцов в таблице БД (без столбца 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 все еще должен быть столбцом идентификатора? – Armitage2k

+0

обновлен для случая, если данные столбца id не находятся в файле csv –

+0

отлично, полюбите его, спасибо. Просто любопытно, это на самом деле MySQL или MySQLi? – Armitage2k

0

Атрибут AUTO_INCREMENT может использоваться для создания уникального идентификатора для новых строк. Большинство версий mysql и engin поддерживают это. Вам не нужно беспокоиться об идентификаторе и использовать задание cron для вставки необходимого поля, и AUTO_INCREMENT позаботится о самом идентификаторе. Значение не было указано для столбца AUTO_INCREMENT, поэтому MySQL автоматически назначил порядковые номера. Вы также можете явно назначить 0 столбцу для генерации порядковых номеров, если не включен режим NO_AUTO_VALUE_ON_ZERO SQL. Если столбец объявлен NOT NULL, также можно назначить NULL столбцу для генерации порядковых номеров. Когда вы вставляете любое другое значение в столбец AUTO_INCREMENT, столбец устанавливается в это значение, и последовательность сбрасывается, так что следующее автоматически генерируемое значение следует последовательно от наибольшего значения столбца.

Вы можете получить последнее автоматически созданное значение AUTO_INCREMENT с помощью функции LAST_INSERT_ID() SQL или функции API mysql_insert_id() C. Эти функции зависят от подключения, поэтому их возвращаемые значения не зависят от другого соединения, которое также выполняет вставки.

См примера из официальной ссылки: [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, вы можете проверить, что происходит из CSV, и может исправить/предотвратить ошибки импорта.

Смежные вопросы