[MySQL][PHP] Jak szybko przenieść zawartość pliku tekstowego do tabeli?
Chcesz umieścić w tabeli dane pochodzące ze zwykłego pliku tekstowym, aby zachowana została struktura tabeli. O wiele łatwiej przeniesiesz w ten sposób dane z arkusza kalkulacyjnego do tabeli w bazie danych. To również najszybszy sposób aby umieścić w bazie danych dużą ilość informacji wprost z pliku txt.
Zamiast pobierać z pliku informacje i wstawiać je do tabeli za pomocą pętli i polecenia SQL INSERT INTO, można sprawę uprościć wstawiając hurtem dużą ilość danych znajdujących się w pliku tekstowym jednym poleceniem. Zobacz jak tego dokonać.
W MySQL domyślny tryb wstawiania danych z pliku przewiduje, że pola w pliku tekstowym rozdzielone są za pomocą tabulatora, np.
a1 b1 c1
a2 b2 c2
a3 b3 c3
Stosując polecenie MySQL:
LOAD DATA INFILE "/dane.txt" INTO TABLE pracownicy;
dodamy do tablicy pracownicy zawartość pliku tekstowego dane.txt (trzy rekordy), dla pierwszych trzech pól tabeli, np. imie, nazwisko, ulica. Oto przykład, gdzie za pomocą języka PHP do tabeli dopisana zostanie zawartość pliku tekstowego:
<?
$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
$wynik = mysql_select_db("baza1",$baza);
if ($wynik) {
$wynik = mysql_query('LOAD DATA INFILE "/dane.txt"
INTO TABLE pracownicy', $baza);
if ($wynik) echo "Tabela została wypełniona danymi z pliku<br>";
}
mysql_close($baza);
}
?>
Ważne jest położenie pliku tekstowego. Ścieżka do niego powinna być pełna (a nie względna), identyczna jak ścieżka na dysku, a więc np. /home/www/txt/dane.txt.
W praktyce często zdarza się, że pola nie są oddzielone tabulatorem, ale innym znakiem, np.:
raz|dwa|trzy
raz|dwa|trzy
raz|dwa|trzy
raz|dwa|trzy
Wtedy do polecenia należy dodać informację o znaku rozdzielającym pola (np. często spotykany znak "|") w postaci FIELDS TERMINATED BY "znak":
LOAD DATA INFILE "/dane.txt" INTO TABLE pracownicy
FIELDS TERMINATED BY "|";
Oczywiście polecenie nie musi być wywoływane ze skryptu PHP, równie dobrze możesz wejść do programu mysql i wywołać polecenie wprost z konsoli.
Jest jeszcze jedna ważna rzecz - gdy umieszczasz zawartość pliku, dane są dodawane do tabeli, która może zawierać już inne rekordy. Gdy dodasz ten sam plik kilka razy dane zostaną powielone. Jeżeli chcesz usunąć stare dane i wypełnić tabelę nowymi z pliku tekstowego, musisz najpierw skasować zawartość całej tabeli, a potem dodać zawartość z pliku tekstowego. Jak w kodzie poniżej:
<?
$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
$wynik = mysql_select_db("baza1",$baza);
if ($wynik) {
$wynik = mysql_query("TRUNCATE TABLE pracownicy", $baza);
if ($wynik) echo "Dane z tabeli zostały usunięte<br>";
$wynik = mysql_query('LOAD DATA INFILE "/dane.txt"
INTO TABLE pracownicy', $baza);
if ($wynik) echo "Tabela została wypełniona danymi z pliku<br>";
}
mysql_close($baza);
}
?>
To w zasadzie najważniejsze informacje. Czasem możesz jeszcze chcieć pominąć podczas dodawania pierwsze linijki pliku (gdzie może znaleźć się opis zawartości). Wtedy należy dodać kolejne polecenie IGNORE x LINES:
LOAD DATA INFILE "/dane.txt" INTO TABLE pracownicy
FIELDS TERMINATED BY "|" IGNORE 2 LINES;
Polecenie zignoruje dwie pierwsze linijki pliku tekstowego, a resztę umieści w tabeli.