У меня много файлов csv в каталоге. С этими файлами я должен написать сценарий, который помещает их содержимое в правильные поля и таблицы моей базы данных. Я почти новичок в php-языке: я нашел несколько фрагментов кода в Интернете. Кажется, это работает, но я застрял на одном уровне. Некоторые темы связаны с этим сайтом, но я не нашел проблему с ecat.
Я написал сценарий php, который позволяет получить путь и имя этих файлов. Мне тоже удалось создать таблицу, имя которой зависит от каждого csv (например: file '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(); ?>
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);