Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Import danych do bazy z plku .txt
Forum PHP.pl > Forum > Bazy danych > MySQL
Earadriel
Witam,
posiadam plik .txt z dużą ilościa danych, które wyglądają tak:

#IDO#zsp19/41?IDO?
#IID#10000?IID?#PID#57?PID?#EID#0?EID?
#RDO#element zespołu?RDO?
#RIN#zabytek?RIN?
#NZW#Obrączki, srebro pr. 84, waga ok. 2 g łącznie, bez napisów, gładkie.?NZW?
#SNZ#Obrączki, srebro pr. 84, waga ok. 2 g łącznie, bez napisów, gładkie.?SNZ?
#SRD#dokument?SRD?
#RDZ#dokument?RDZ?<RDZ>
#PIN#d:\monaobrokrzei\nowina-konopka\nowina-konopka różne\mzm-zsp19_41.jpg?PIN?#PI1#T?PI1?#PI2#T?PI2?#PI3#T?PI3?#PI4#T?PI4?#PIR#pliki graficzne?PIR?<PIN>

Chciałbym zaimportować do bazy MySQL (na stronę www) dane z tego pliku.
Interesują mnie stąd głównie pola #NZW#, #SRD# i #PIN#, które miałyby być zaimportowane do tabeli przedmioty do odpowiadających im pół nazwa, kategoria i obrazek.
W jaki sposób mógłbym to to zrobić?
buliq
file_get_contents oraz preg_match
MySQL sam z siebie nie przerobi tych danych
bpskiba
Tutaj Microsoft ma lekką przewagę: bulk insert
Earadriel
Na razie napisałem coś takiego:


  1. $connection = @mysql_connect('localhost', 'xxx', 'xxx')
  2. or die('Brak połączenia z serwerem MySQL');
  3. $db = @mysql_select_db('xxx', $connection)
  4. or die('Nie mogę połączyć się z bazą danych');
  5.  
  6.  
  7. $tresc = file_get_contents('plik.txt');
  8.  
  9. preg_match_all("/MZM\-.*\d/i", $tresc, $znalezione); //MZM-CokolwiekLiczba
  10.  
  11.  
  12. foreach ($znalezione as $ciag) {
  13. for ($i=0; $i<681; $i++) {
  14. echo "\nNumer ID: " . $ciag[$i] . "\n";
  15.  
  16. $ins = @mysql_query("INSERT INTO przedmioty SET numer_katalogowy='$ciag[$i]'");
  17. if($ins) echo "Rekord został dodany poprawnie";
  18. else echo "Błąd nie udało się dodać nowego rekordu";
  19.  
  20. }
  21. }
  22.  
  23.  
  24. mysql_close($connection);


Skrypt znajduje wszystkie numery katalogowe w pliku tekstowym i zapisuje je po kolei do tabeli przedmioty, do pola numer_katalogowy.
Nie wiem jednak jak zrobić by został dodany kompletny wpis, to znaczy z każdym przejściem pętli żeby do tabeli był zapisywany rekord zawierajacy numer_katalogowy, kategorię do której zostanie dodany przedmiot (np. jesli w pliku tekstowym mamy #SRD#dokument?SRD? to do kategorii o numerze id 1, a jeśli #SRD#obraz?SRD? to do kategorii o id 2 itp.) oraz opis przedmiotu i ścieżkę do zdjęcia.

Zawartość pliku tekstowego (mały fragment):


Kod
#IDO#MZM-47?IDO?
#IID#10001?IID?#PID#47?PID?#EID#0?EID?
#RDO#pojedynczy obiekt?RDO?
#RIN#zabytek?RIN?
#NZW#Obraz "Kwiaty" olej, płyta pilśniowa.?NZW?
#SNZ#Obraz "Kwiaty" olej, płyta pilśniowa.?SNZ?
#SRD#obraz?SRD?
#RDZ#obraz?RDZ?<RDZ>



#IDO#MZM-48?IDO?
#IID#10001?IID?#PID#48?PID?#EID#0?EID?
#RDO#pojedynczy obiekt?RDO?
#RIN#zabytek?RIN?
#NZW#Paszport pani Komorzyckiej z Chmielewa z 1916r.?NZW?
#SNZ#Paszport pani Komorzyckiej z Chmielewa z 1916r.?SNZ?
#SRD#dokument?SRD?



Byłbym wdzięczny za jakieś porady, bo nie mam zbyt wielkiego doświadczenia z php i sql.

Osiągnąłem już to co chciałem, prawie. biggrin.gif

  1. <?php
  2.  
  3. $connection = @mysql_connect('localhost', 'xxx', 'xxx')
  4. or die('Brak połączenia z serwerem MySQL');
  5. $db = @mysql_select_db('xxx', $connection)
  6. or die('Nie mogę połączyć się z bazą danych');
  7.  
  8.  
  9.  
  10. $tresc = file_get_contents('plik.txt');
  11.  
  12. preg_match_all("/IDO\#.*\?IDO\?/i", $tresc, $znalezione);
  13. preg_match_all("/SNZ\#.*\?SNZ\?/i", $tresc, $znalezione2);
  14. preg_match_all("/SRD\#.*\?SRD\?/i", $tresc, $znalezione3);
  15. preg_match_all("/PIN\#.*\?PIN\?/i", $tresc, $znalezione4);
  16. preg_match_all("/NZW\#.*\?NZW\?/i", $tresc, $znalezione5);
  17.  
  18. foreach ($znalezione as $ciag) { //id
  19. foreach ($znalezione2 as $ciag2) { //nazwa
  20. foreach ($znalezione3 as $ciag3) { //kategoria
  21. foreach ($znalezione4 as $ciag4) { //zdjecie
  22. foreach ($znalezione5 as $ciag5) { //opis
  23.  
  24.  
  25. for ($i=0; $i<681; $i++) {
  26.  
  27. $ciag[$i] = substr($ciag[$i], 4, -5);
  28. $ciag2[$i] = substr($ciag2[$i], 4, -5);
  29. $ciag3[$i] = substr($ciag3[$i], 4, -5);
  30. $ciag4[$i] = substr($ciag4[$i], 4, -5);
  31. $ciag5[$i] = substr($ciag5[$i], 4, -5);
  32.  
  33. if ($ciag3[$i]=='#SRD#dokument?SRD?') {$id=1;}
  34. else $id=2;
  35.  
  36. $ins = @mysql_query("INSERT INTO przedmioty SET param='par_Numer katalogowy@@:@@$ciag[$i]', name='$ciag2[$i]', category_id='$id', image_url='$ciag4[$i]', description='$ciag5[$i]'");
  37. if($ins) echo "Rekord został dodany poprawnie";
  38. else echo "Błąd nie udało się dodać nowego rekordu";
  39.  
  40. }
  41. }}}}}
  42.  
  43. mysql_close($connection);
  44.  
  45. ?>


Może nie jest za piękne ale działa, mam tylko jeden problem.
Jeśli przy przedmiocie nie ma zdjęcia to w pliku tekstowym wpis #PIN#images/zdjecie.jpg?PIN? nie istnieje. Dodałem więc w pliku w edytorze tekstowym automatycznie pusty wpis
#PIN#?PIN? tam gdzie go nie ma. To już jest ok.
Problem pojawia się gdy do jednego rekordu mamy kilka zdjęć, czyli kilka razy w pliku do jednego przedmiotu
#PIN#images/zdjecie.jpg?PIN?
#PIN#images/zdjecie2.jpg?PIN? itd.
W takim wypadku jak idzie pętla to zdjęcie w pewnym momencie będzie miało inny numer $ciag4[$i] niż nazwa przedmoiotu $ciag2[$i] , opis przedmiotu $ciag5[$i] itd.

Jeśli w bazie danych do danego przedmiotu zostanie przydzielonych kilka sciezek do zdjeć oddzielonych średnikiem to tak moze myć. Ale opcja z tylko jednym zdjęciem będzie zadowalająca.
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.