Импорт данных CSV с использованием PHP/MySQL
У меня возникла небольшая проблема при попытке импортировать данные из CSV, и у меня есть пара вопросов, которые я до сих пор не решил сам.
Во-первых, вот мой код, который поможет взглянуть на вещи в перспективе (немного привести в порядок, убрать связь с CSS и БД):
<body>
<div id="container">
<div id="form">
<?php
$deleterecords = "TRUNCATE TABLE tablename"; //empty the table of its current records
mysql_query($deleterecords);
//Upload File
if (isset($_POST['submit'])) {
if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded
successfully." . "</h1>";
echo "<h2>Displaying contents:</h2>";
readfile($_FILES['filename']['tmp_name']);
}
//Import uploaded file to Database
$handle = fopen($_FILES['filename']['tmp_name'], "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$import="INSERT into importing(text,number)values('$data[0]','$data[1]')";
mysql_query($import) or die(mysql_error());
}
fclose($handle);
print "Import done";
//view upload form
} else {
print "Upload new csv by browsing to file and clicking on Upload<br />\n";
print "<form enctype='multipart/form-data' action='upload.php' method='post'>";
print "File name to import:<br />\n";
print "<input size='50' type='file' name='filename'><br />\n";
print "<input type='submit' name='submit' value='Upload'></form>";
}
?>
</div>
</div>
</body>
Это в основном адаптация примера, который я нашел после многих попыток применения различных методов.
У моего CSV есть два столбца данных, первый из которых текстовый, а второй целые. Таблица в базе данных также имеет два столбца: первый называется "текст", а второй - "число".
Итак, у меня есть следующие вопросы:
- загружаемый текст просто отображается как 0 в каждом поле, и я не уверен, почему
- Я продолжаю читать о данных, заключенных в "", если это произойдет, как бы я их отсортировал?
- как я могу игнорировать первые X строк CSV для заголовков и т. д.?
- формат данных изменяется во время этого процесса, или он готов для использования в графике? Например, будет ли десятичная дробь оставаться десятичной после размещения в базе данных?
Я думаю, что охватывает все, заранее спасибо за любую помощь!
РЕДАКТИРОВАТЬ:
Только что проверил загрузку 10000 записей и получил ошибку:
"Неустранимая ошибка: превышено максимальное время выполнения 30 секунд"
Какие-нибудь мысли?
6 ответов
На днях я ответил на практически идентичный вопрос: сохраняйте файлы CSV в базе данных mysql
MySQL имеет функцию LOAD DATA INFILE
, что позволяет импортировать файл CSV непосредственно в одном запросе SQL, без необходимости обрабатывать его в цикле через вашу PHP-программу.
Простой пример:
<?php
$query = <<<eof
LOAD DATA INFILE '$fileName'
INTO TABLE tableName
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field1,field2,field3,etc)
eof;
$db->query($query);
?>
Это так просто.
Нет петель, нет суеты. И гораздо быстрее, чем парсинг в PHP.
Страница руководства MySQL здесь: http://dev.mysql.com/doc/refman/5.1/en/load-data.html
надеюсь, это поможет
$i=0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i>0){
$import="INSERT into importing(text,number)values('".$data[0]."','".$data[1]."')";
mysql_query($import) or die(mysql_error());
}
$i=1;
}
set_time_limit(10000);
$con = mysql_connect('127.0.0.1','root','password');
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("db", $con);
$fp = fopen("file.csv", "r");
while( !feof($fp) ) {
if( !$line = fgetcsv($fp, 1000, ';', '"')) {
continue;
}
$importSQL = "INSERT INTO table_name VALUES('".$line[0]."','".$line[1]."','".$line[2]."')";
mysql_query($importSQL) or die(mysql_error());
}
fclose($fp);
mysql_close($con);
letsay $infile = a.csv // файл должен быть импортирован.
class blah
{
static public function readJobsFromFile($file)
{
if (($handle = fopen($file, "r")) === FALSE)
{
echo "readJobsFromFile: Failed to open file [$file]\n";
die;
}
$header=true;
$index=0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
// ignore header
if ($header == true)
{
$header = false;
continue;
}
if ($data[0] == '' && $data[1] == '' ) //u have oly 2 fields
{
echo "readJobsFromFile: No more input entries\n";
break;
}
$a = trim($data[0]);
$b = trim($data[1]);
if (check_if_exists("SELECT count(*) FROM Db_table WHERE a='$a' AND b='$b'") === true)
{
$index++;
continue;
}
$sql = "INSERT INTO DB_table SET a='$a' , b='$b' ";
@mysql_query($sql) or die("readJobsFromFile: " . mysql_error());
$index++;
}
fclose($handle);
return $index; //no. of fields in database.
}
function
check_if_exists($sql)
{
$result = mysql_query($sql) or die("$sql --" . mysql_error());
if (!$result) {
$message = 'check_if_exists::Invalid query: ' . mysql_error() . "\n";
$message .= 'Query: ' . $sql;
die($message);
}
$row = mysql_fetch_assoc ($result);
$count = $row['count(*)'];
if ($count > 0)
return true;
return false;
}
$infile=a.csv;
blah::readJobsFromFile($infile);
}
надеюсь это поможет.
Я думаю, что главное, что нужно помнить при разборе CSV, это то, что он следует некоторым простым правилам:
а) это текстовый файл, который легко открывается б) каждая строка определяется концом строки \n, поэтому сначала разбейте строку на строки в) каждая строка / строка имеет столбцы, определяемые запятой, поэтому разбейте каждую строку на эту, чтобы получить массив колонн
прочитайте этот пост, чтобы понять, о чем я говорю
это на самом деле очень легко сделать, когда вы освоитесь и станете очень полезными.
Подключение к базе данных:
try {
$conn = mysqli_connect($servername, $username, $password, $db);
//echo "Connected successfully";
} catch (exception $e) {
echo "Connection failed: " . $e->getMessage();
}
Код для чтения файла CSV и загрузки в таблицу в базе данных.
$file = fopen($filename, "r");
while (($getData = fgetcsv($file, 10000, ",")) !== FALSE) {
$sql = "INSERT into db_table
values ('','" . $getData[1] . "','" . $getData[2] . "','" . $getData[3] . "','" . $getData[4] . "','" . $getData[5] . "','" . $getData[6] . "')";
$result = mysqli_query($conn, $sql);
if (!isset($result)) {
echo "<script type=\"text/javascript\">
alert(\"Invalid File:Please Upload CSV File.
window.location = \"home.do\"
</script>";
} else {
echo "<script type=\"text/javascript\">
alert(\"CSV File has been successfully Imported.\");
window.location = \"home.do\"
</script>";
}
}
fclose($file);