У меня возникла проблема с попыткой импортировать данные из 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 имеет два столбца данных, первый из которых является текстом, а второй – целыми. В таблице в базе данных также есть два столбца: первый – «текст» и второй «номер»,
Поэтому у меня есть следующие вопросы:
Я думаю, что это все, спасибо за любую помощь!
РЕДАКТИРОВАТЬ:
Просто выполнил тест на 10 000 записей и получил ошибку:
«Неустранимая ошибка: превышено максимальное время выполнения 30 секунд»
Есть предположения?
Я ответил на практически идентичный вопрос только на днях: сохраните 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);
файл $ 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, состоит в том, что оно следует некоторым простым правилам:
a) это текстовый файл, который так легко открывается. b) каждая строка определяется концом строки \ n, поэтому сначала разбиваем строку на строки. c) каждая строка / строка имеет столбцы, определенные запятой, поэтому разделяйте каждую строку на это, чтобы получить массив столбцов
прочитайте этот пост, чтобы узнать, о чем я говорю
на самом деле это очень легко сделать, как только вы повеситесь, и станет очень полезным.
Подключение к базе данных:
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);