2013-08-19 2 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

Вы можете (аb) использовать 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) 

Если для того, чтобы загрузить все файлы в папке, вы должны назвать это заявление из цикла на вашем языке хоста Можно даже сделать это с помощью простого скрипта:

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 
Смежные вопросы