2012-07-12 122 views
20

我在嘗試從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有兩列數據,第一個是文本,第二個是整數 在數據庫中的表也有兩列,第一個所謂的「文本」,第二個「數字」

所以我有問題是:

  1. 只是被顯示爲在各個領域的0文本被上傳,我不知道爲什麼
  2. 我繼續閱讀關於結束了數據附上「」,如果出現這種情況我將如何分類?
  3. 我該如何忽略頭文件等CSV的前X行?
  4. 是在整個過程中更改的數據格式,還是可以在圖形中使用?例如一旦放入數據庫中,小數會保留一位小數嗎?

我認爲這涵蓋了一切,預先感謝任何幫助!

編輯:

剛剛做了萬載紀錄的試驗,得到了錯誤:

「致命錯誤:最長30秒的執行時間超過了」

有什麼想法?

+2

如果您要上傳大文件,也看看[LOAD DATA INFILE(http://dev.mysql.com/doc/refman/5.1/en/load-data.html)作爲它更快。 'LOAD DATA INFILE'/tmp/test.txt'INTO TABLE test IGNORE 1 LINES;' – Fluffeh 2012-07-12 09:01:53

+0

@Fluffeh 我嘗試過使用該方法,但由於某種原因,當我將它合併到PHP中時,它不起作用。速度肯定會很有用,因爲它最終會成爲一個大文件。 – Pidge 2012-07-12 09:08:00

+0

檢查我的更新答案。 – jit 2012-07-12 09:22:43

回答

52

我回答了幾乎相同的問題,只是有一天:Save CSV files into mysql database

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

希望幫助

+0

對不起,我甚至沒有遇到過在網上衝浪的時候,顯然我在尋找錯誤的東西! 如果你能有一個快速瀏覽一下,以檢查在這裏,我把它放在我會永遠感激好心的先生:) (pastebin.com/e9wvsT4c) (節省垃圾郵件文本到處再次) – Pidge 2012-07-12 10:48:43

+1

您的引擎收錄的代碼看起來好像你有正確的想法。一些錯誤仍然存​​在(例如'$ filename'沒有設置),但我相信你會很容易地處理這些錯誤。 – SDC 2012-07-12 11:21:32

+0

非常感謝您的幫助! :) – Pidge 2012-07-12 11:23:52

6
$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; 
} 
+0

用文字修復了這個問題:) – Pidge 2012-07-12 09:11:15

+0

出於好奇,這是什麼部分讓它忽略了CSV的第一行? – Pidge 2012-07-12 09:36:34

+0

代碼差異與您的代碼將得到您的答案。接受適當的答案作爲接受的答案 – jit 2012-07-12 09:56:33

1

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

希望這有助於。

2
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); 
+0

@Pidge「剛剛做了10,000條記錄上傳的測試,並得到了錯誤..」使用此腳本,我已經從CSV導入了超過1M條記錄。它應該適合你。 – dzeno 2012-07-12 10:01:40

0

我認爲主要的事情要記住解析CSV是它遵循一些簡單的規則:

一)這是一個文本文件,以便容易打開 b)每一行由行結束符確定\ n所以將字符串分成第一行 c)每行/行具有由逗號決定的列,以便將每行分割以獲得一列數組

have a read of this post看到我在說什麼

一旦你掌握了它並變得非常有用,它實際上很容易做到。

0

數據庫連接:

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