2013-08-19 81 views
0

我有一個包含大約10.000個文本文件的文件夾。我想將這些文件導入到兩列的MySQL表中。對於每一行,我希望在一列中包含文本文件的標題(例如1234.txt),並在另一列中包含文件的內容。我可以使用PHP。你會如何建議我這樣做?將多個文本文件及其標題導入到MySQL中

+0

一般來說,我會建議保留在文件系統中的文件,而不是在數據庫中 – Anigel

+0

感謝您的建議。我需要用一個僅在MySQL上可用的腳本來處理文本。所以我需要找到一種方法來導入文件。 – user1029296

+1

這裏需要一些說明。首先,你最大的文本文件的長度是多少?你需要知道這個可以選擇適當的數據類型,例如'VARCHAR(255)','TEXT','MEDIUMTEXT'等。第二,你的「腳本」如何使用這個表格?它使用「FULLTEXT」搜索嗎?它是否需要文本列上的索引?第三,你的文本是以ASCII,Latin-1,UTF-8記錄的還是什麼? –

回答

1

您可以嘗試類似下面的代碼,下面的代碼將遍歷目錄中的所有文本文件,並將每個文件的文件名作爲標題和內容作爲內容添加到MySQL數據庫。

<?php 
$size = ""; 
//Change "MyFolder" with the path and name of the directory where the .txt files are located. 
$dir = "MyFolder"; 

if ($handle = opendir($dir)) { 
    while (false !== ($file = readdir($handle))) { 
     if($file == '.' || $file == '..') continue; 

     $myFile = "$dir/$file"; 
     $fh = fopen($myFile, 'r'); 

     $size = filesize($myFile); 
     if ($size > 0) { 
     $content = fread($fh, $size); 

     $title = $file; 
     echo $title."</br>"; 
     } 

     $con=mysqli_connect("HostName","Username","Password","Database"); 
     // Check connection 
     if (mysqli_connect_errno()) 
     { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
     }  
     mysqli_query($con,"INSERT INTO table_name (Title, Content) VALUES ('$title', '$content')"); 

     mysqli_close($con); 

     fclose($fh); 
    } 
closedir($handle); 
} 
?> 
+0

非常感謝你的答案。我只是測試它,它似乎並沒有工作。你想知道爲什麼嗎?沒有錯誤,沒有任何東西,它只是不加載表中的任何東西。包含所有文本文檔的文件夾「myfolder」與php腳本位於同一文件夾中。 – user1029296

+1

我的不好,這是一個目錄問題。有效!非常感謝! – user1029296

+0

沒問題,它可能不是最好的解決方案,但我希望它有幫助。 – Malcolm

0

你可以(AB)使用LOAD DATA INFILE加載整個文件中的一列。該「絕招」就是提供的字符序列是不存在的文件作爲行/場終止在:

mysql> create table tbl(fname CHAR(255), data TEXT); 
Query OK, 0 rows affected (0.35 sec) 


mysql> LOAD DATA INFILE '/tmp/demo.txt' INTO TABLE tbl 
      FIELDS TERMINATED BY 'XXX' LINES TERMINATED BY 'YYY' 
      (data) SET fname = 'demo.csv'; 
Query OK, 1 row affected (0.00 sec) 
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 

mysql> select * from tbl; 
+----------+--------------------------------------------------------------------------------------------------+ 
| fname | data                        | 
+----------+--------------------------------------------------------------------------------------------------+ 
| demo.csv | Date, Amount, Name 
2013-01-01, 1000, "Apple" 
2013-01-02, 500, "Orange" 
2013-01-03, 250, "Prune" 
| 
+----------+--------------------------------------------------------------------------------------------------+ 
1 rows in set (0.00 sec) 

如果要加載一個文件夾中的所有文件,你將不得不調用語句從您的主機語言中的循環你甚至可以這樣做一個簡單的shell腳本:

for i in *.txt; do 
    echo "LOAD DATA INFILE '$i' INTO TABLE tbl 
       FIELDS TERMINATED BY 'XXX' LINES TERMINATED BY 'YYY' 
       (data) SET fname = '$i';"; 
    done 
    | mysql -p -u user_name -h host_name db_name 
相關問題