Сохраните файлы CSV в базе данных MySQL
У меня есть много CSV-файлов в каталоге. С этими файлами я должен написать скрипт, который поместит их содержимое в нужные поля и таблицы моей базы данных. Я почти новичок в языке php: я нашел несколько фрагментов кода в Интернете. Кажется, работает, но я застрял на стадии. Некоторые темы связаны с этим сайтом, но я не нашел проблему с ecat.
Я написал скрипт php, который позволяет получить путь и имя этих файлов. Мне также удалось создать таблицу, имя которой зависит от каждого CSV (например, файл 'data_1.csv' дает таблицу data_1.csv в my-sql). Все таблицы имеют три одинаковых поля: id, url, value. Последнее, что нужно сделать, это заполнить эти таблицы, прочитав каждый файл и поместив значения, разделенные '|' символ в правильных таблицах. Например, если строка 'data_1.csv'
8756|htttp://example.com| что-то написано
Я хотел бы получить запись в таблице data_1.csv, где 8756 находится в id, htttp://example.com в поле url и что-то записано в поле значения. Я нашел способ прочитать и распечатать эти CSV с помощью функции fcsvget. Но я не знаю, как заставить эти строки войти в базу данных SQL. Может ли кто-нибудь помочь мне в этом вопросе?
Вот мой сценарий ниже
<?php
ini_set('max_execution_time', 300);
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass, true) or die ('Error connecting to mysql');
$dbname = 'test_database';
mysql_select_db($dbname);
$bdd = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
else {
echo "hello <br>";
}
$dir = 'C:\wamp\www\test';
$imgs = array();
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if (!is_dir($file) && preg_match("/\.(csv)$/", $file)) {
array_push($imgs, $file);
}
}
closedir($dh);
} else {
die('cannot open ' . $dir);
}
foreach ($imgs as $idx=>$img) {
$class = ($idx == count($imgs) - 1 ? ' class="last"' : '');
$filePath=$dir . '\\'. $img;
$file = fopen($filePath, "r") or exit("Unable to open file!");
$nom = 'FILE: ' . $dir . '\\'. $img;
echo $nom;
settype($nom, "string");
echo '<br>';
$chemin = '<img src="' . $dir . $img . '" alt="' .
$img . '"' . $class . ' />' . "\n";
echo $chemin;
$file_name = basename($filePath);
$sql = 'CREATE TABLE `' . $file_name . '` (id int(20000), url varchar(15), value TEXT)';
mysql_query($sql,$conn);
$handle = fopen($filePath, 'r');
while (($row = fgetcsv($handle)) !== false) {
foreach ($row as $field) {
echo $field . '<br />';
}
}
fclose($handle);
}
echo ("VERIFY");
for ($i = 1; $i <= 1682; $i++) {
echo ("<br>A : " . $i);
$checkRequest= "select * from movies where movieID='". $i."'";
echo ("<br>". $checkRequest);
if ($result = $mysqli->query($checkRequest)) {
printf("<br> Select ". $i ."returned %d rows.\n", $result->num_rows);
if ($result->num_rows == 0) {
echo ("I : " . $i);
}
$result->close();
}
}
$mysqli->close();
?>
2 ответа
MySQL предоставляет замечательную функцию, которая позволяет импортировать файл CSV напрямую, в одном запросе.
SQL-команда, которую вы ищете LOAD DATA INFILE
Страница руководства здесь: http://dev.mysql.com/doc/refman/5.1/en/load-data.html
Быстрый пример:
LOAD DATA INFILE 'fileName'
INTO TABLE tableName
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(
field1,
field2,
field3,
@variable1,
@variable2,
etc
)
set
(
field4 = concat(@variable1,@variable2)
);
Это довольно простой пример, но он охватывает большую часть того, что вы хотите. Страница руководства дает полную информацию о том, как сделать с ней очень сложные вещи.
Надеюсь, это поможет.
После
foreach ($row as $field) {
echo $field . '<br />';
Вам нужно разобрать результат после ;
лайк:
$pieces = explode(";", $field);
а затем вставьте каждый кусок в базу данных
$sql = ' INSERT INTO X VALUES ("'.$pieces[0].'","'.$pieces[1].'","'.$pieces[2].'","'.$pieces[3].'","'.$pieces[4].'")';
mysql_query($sql, $conn);
Также можно использовать mysqlimport
private function runImport($host, $username, $password, $schema, $csvFilePath) {
$output = array();
$cmd = "/usr/bin/mysqlimport --host=$host";
$cmd .= ' --fields-terminated-by=\',\' --fields-optionally-enclosed-by=\'"\' ';
$cmd .= ' --user=' . $username . ' --password='. $password;
$cmd .= " $schema $csvFilePath";
exec($cmd, $output, $retVal);
foreach ($output as $line) {
echo "$line\n";
}
echo "\n\nReturn code : $retVal";
}