Php 将多个文本文件及其标题导入MySQL

Php 将多个文本文件及其标题导入MySQL,php,mysql,Php,Mysql,我有一个包含大约10000个文本文件的文件夹。我想将这些文件导入到一个包含两列的MySQL表中。对于每一行,我希望在一列中显示文本文件的标题(例如1234.txt),在另一列中显示文件的内容。我会用PHP。您建议我怎么做?您可以尝试以下方法,下面的代码将遍历目录中的所有文本文件,并将每个文件的文件名作为标题,将内容作为内容添加到MySQL数据库中 <?php $size = ""; //Change "MyFolder" with the path and name of the dire

我有一个包含大约10000个文本文件的文件夹。我想将这些文件导入到一个包含两列的MySQL表中。对于每一行,我希望在一列中显示文本文件的标题(例如1234.txt),在另一列中显示文件的内容。我会用PHP。您建议我怎么做?

您可以尝试以下方法,下面的代码将遍历目录中的所有文本文件,并将每个文件的文件名作为标题,将内容作为内容添加到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);
}
?>
您可以使用(ab)在列中加载整个文件。“技巧”只是提供文件中不存在的字符序列作为行/字段终止:

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

一般来说,我建议将文件保存在文件系统中,而不是数据库中。谢谢你的建议。我需要用一个只在MySQL上可用的脚本来处理文本。所以我需要找到一种导入文件的方法。这里需要一些澄清。首先,你最大的文本文件的长度是多少?您需要了解这一点才能选择适当的数据类型,例如
VARCHAR(255)
TEXT
MEDIUMTEXT
,等等。其次,您的“脚本”如何使用此表?它是否使用
全文
搜索?它是否需要文本列上的索引?第三,你的文本是用ASCII、拉丁文1、UTF-8还是什么格式记录的?我认为你不能只用MySQL来记录。你能使用像PHP这样的脚本语言吗?我试着在bash中这样做,但我放弃了(逃跑是个问题)。@OllieJones:最大的文件是3K个字符。我需要一个文本列的索引。我不知道编码是什么。非常感谢你的回答。我只是测试了一下,它似乎不起作用。你知道为什么吗?没有错误,没有任何内容,它只是不加载表中的任何内容。包含所有文本文档的文件夹“myfolder”与php脚本位于同一文件夹中。糟糕,这是一个目录问题。成功了!非常感谢!没问题,这可能不是最好的解决方案,但我希望它能有所帮助。确实如此!不过,我有一个简短的问题要问你。我的文件夹中有8K个文本文件。我添加了一个echo$标题;在脚本中,以便我可以确保导入所有文档。奇怪的是,所有名称都显示为已导入,但数据库中缺少2K行。我试了两次。有什么想法吗?好的,没问题。我将查看代码并更新我的答案。