使用PHP / MySQL导入CSV数据

我在尝试从CSV导入数据时遇到了一些问题,并且还有一些问题尚未解决。

首先,我的代码是用来帮助理解事物(清理CSS和DB连接):

<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> 

这基本上是我经过许多尝试各种方法后find的一个例子的改编。

我的CSV有两列数据,第一列是文本,第二列是整数。数据库中的表也有两列,第一列叫做“文本”,第二列是“数字”

所以我的问题是:

  1. 正在上传的文本只是在每个字段显示为0,我不知道为什么
  2. 我一直在阅读以“”结尾的数据,如果发生这种情况,我会如何分类?
  3. 我怎样才能忽略CSV头第一个X行?
  4. 数据格式是在整个过程中改变的,还是可以在graphics中使用? 例如,如果一个数字在数据库中保留一位小数,那么它会保留一个小数?

我认为这涵盖了一切,预先感谢任何帮助!

编辑:

刚刚做了1万条logging上传的testing,得到的错误是:

“致命错误:超过30秒的最大执行时间”

有什么想法吗?

我刚才回答了一个几乎相同的问题: 将CSV文件保存到mysql数据库

MySQL有一个functionLOAD DATA INFILE ,允许它直接在一个SQL查询中导入一个CSV文件,而不需要通过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中parsing它快得多。

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); } 

希望这可以帮助。

我认为关于parsingCSV的主要事情是它遵循一些简单的规则:

a)这是一个很容易打开的文本文件b)每一行由行结束符确定\ n所以先将string拆分成行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);