Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php+mysql] Dodanie linijek z pliku TXT do bazy MySQL, jedna linijka z pliku tekstowego = jedno pole w MySQL
tomilipin
post 25.02.2012, 14:38:08
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 28.01.2004
Skąd: że znowu ლ(ಠ益ಠლ

Ostrzeżenie: (0%)
-----


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?


--------------------
Kod
$kobieta = 'Kobieta zmienną jest...';
Go to the top of the page
+Quote Post
CTRL
post 25.02.2012, 16:10:16
Post #2





Grupa: Zarejestrowani
Postów: 133
Pomógł: 8
Dołączył: 23.09.2011
Skąd: Stromiec

Ostrzeżenie: (0%)
-----


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

Ten post edytował CTRL 25.02.2012, 16:39:51


--------------------
Go to the top of the page
+Quote Post
tomilipin
post 25.02.2012, 16:55:51
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 28.01.2004
Skąd: że znowu ლ(ಠ益ಠლ

Ostrzeżenie: (0%)
-----


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. }


--------------------
Kod
$kobieta = 'Kobieta zmienną jest...';
Go to the top of the page
+Quote Post
mortus
post 25.02.2012, 17:24:03
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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().

Ten post edytował mortus 25.02.2012, 17:24:32
Go to the top of the page
+Quote Post
Barcelona
post 25.02.2012, 19:05:35
Post #5





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
tomilipin
post 25.02.2012, 21:13:40
Post #6





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 28.01.2004
Skąd: że znowu ლ(ಠ益ಠლ

Ostrzeżenie: (0%)
-----


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?


--------------------
Kod
$kobieta = 'Kobieta zmienną jest...';
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.08.2025 - 23:03