Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php+mysql] Dodanie linijek z pliku TXT do bazy MySQL
Forum PHP.pl > Forum > PHP
tomilipin
Mam w pliku tekstowym około 300 linijek danych. Jest to tekst otoczony cudzysłowami, każda linijka kończy się przecinkiem. Poniżej wycinek z pliku:

Kod
"linijka pierwsza - tytuł",
"Opis linijki pierwszej. Bla bla bla.",
"Warszawa",
"Jest to stolica Polski.",
"Komputery",
"Bardzo lubię grać w gry, najlepiej "Tomb Rajder", który jest fajny.",


Muszę to przenieść do bazy MySQL (w tabeli "tekst" mam pola id, tytul, tresc).

Prosta sprawa ale kompletnie nie potrafię operować na plikach sad.gif
Wiem tylko, że to będzie tak:
- linijka 1 = tytul 1
- linijka 2 = tresc 1
- linijka 3 = tytul 2
- linijka 4 = tresc 2
itd.

Jak to zrobić w PHP?
CTRL
Ja jestem słabiak, ale zrobiłbym to tak:
Czytamy plik (kiedyś się bawiłem, jakiś fread był od tego)
Robimy explode (przecinki)
Pętla for wykonywana liczba tablicy z explode /2
Dodajemy do bazy linijkę z tablicy taką jaką nam pokazuje for i następnie dodajemy aż do 4.
Nie wiem jak to wytłumaczyć, może spróbuję zrobić ten kod to w edicie dam

Edit:
Poradziłem sobie, został jedynie przecinek na końcu ale to już sobie go wytniesz jakoś
http://m.cezary.pl/test/zpliku.php
tomilipin
Od rana nad tym siedzę i są efekty smile.gif

Zrobiłem troszkę inaczej i krócej przy okazji smile.gif

  1. $plik = "plik.txt";
  2. $linijka = file($plik);
  3. $dane = array();
  4.  
  5. foreach($linijka as $wartosc) {
  6. array_push($dane, $wartosc);
  7. }


a potem w pętli usuwam niepotrzebne cudzysłowy z początków a z końców linijek wywalam przecinek, cudzysłów i znaki końca wiersza.
Na razie wyświetlam po dwa na raz, oczywiście zaraz zmienię na wstawianie do bazy danych
  1. for ($i=0;$i<=10;($i+=2)) {
  2. print ltrim(rtrim($dane[$i], "\n\r\,\""), "\"").' - '.ltrim(rtrim($dane[($i+1)], "\n\r\,\""), "\"").'<br/><br/>';
  3. }
mortus
file() (podobnie jak i file_get_contents()) zda egzamin tylko dla niedużych plików (powiedzmy, że do 50MB). Skoro używasz file() to równie dobrze możesz użyć file_get_contents() i explode(), ta druga funkcja przy okazji usunie przecinki. Pętla foreach i przepisywanie tablicy za pomocą array_push() jest w ogóle zbędne, co więcej funkcja array_push() może tutaj coś poknocić, choć tak na prawdę niczego w tej chwili nie robi. Zamiast tego można posłużyć się pętlą for i w tej pętli wygenerować zapytanie SQL, które powinno być de facto zapytaniem MULTI-INSERT:
  1. $content = file_get_contents('plik.txt');
  2. $data = explode(',', $content);
  3. for($i = 0; $i < count($data); $i += 2) {
  4. // tutaj generujemy zapytanie MULTI-INSERT
  5. }
Zamiast zagnieżdżać rtrim() w ltrim() możesz użyć po prostu trim().
Barcelona
Takie coś znalazłem:

  1. $plik = file('dane.txt');
  2.  
  3. foreach($plik as $linia) {
  4. $i++;
  5. list($id, $imie, $nazwisko, $wiek) = explode(',', trim($linia));
  6. $wynik = mysql_query("
  7. INSERT INTO ludzie
  8. SET id='$id', imie='$imie', nazwisko='$nazwisko', wiek='$wiek'
  9. ");
  10. if (!wynik) echo "Błąd w linii $i ".mysql_error()." <br />";
  11. }
  12.  
tomilipin
Widzę, że pojawiła się jeszcze prostsza opcja smile.gif
Chociaż mój plik nie jest duży (68KB) to mój skrypt wykonuje się prawie 15 sekund. Jak na jednorazowe użycie to ujdzie... ważne że nie ma timeouta wink.gif
Przypuszczam, że kod użytkownika Barcelona będzie dużo szybszy - wykorzystam przy instalacji całości na serwerze jeśli mój polegnie.

Cały mój projekt dotyczy kompletnie czego innego więc nie mam zamiaru skupiać się na importowaniu danych - ważne, że działa. Niemniej jednak dziękuję za pomoc!

---


Pojawił się jeden mały problem: źle wyświetlane są niektóre znaki, np. niemieckie umlauty albo znak "stopni" (Celsjusza, nie wiem jak to się nazywa).
Plik txt i wszystkie php koduję w utf-8 więc nie wiem dlaczego tak się dzieje... Jakieś wskazówki?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.