Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Upload i analiza pliku txt
Forum PHP.pl > Forum > PHP
ktuvok
Administruję systemem działającym w oparciu o tabele MySQL. Pojawił się
pomysł rozbudowy go o funkcję, polegającą na:
1. wczytaniu na serwer pliku .txt o określonej strukturze,
2. imporcie danych z tego pliku do określonej tabeli bazy,
3. analizy tych danych pod jakimśtam kątem.

O ile z 1. i 3. sobie poradzę, o tyle nie bardzo wiem, w jaki sposób:
- sprawdzić, czy plik txt ma odpowiednią strukturę (tekst rozdzielany
średnikami, odpowiedni typ danych w kolumnach etc),
- zaciągnąć dane z pliku do odpowiedniej tabeli - przy czym chodzi tu o
zwykły INSERT INTO, ale z użyciem WHERE (importowane mają być rekordy, które
spełniają określone kryterium).

Pomóżcie. Linki do jakichś przykładów też mile widziane.

Pozdrawiam,
K
SHiP
Co do punktu nr 1

==> http://ship.me2.pl/index.php?d=6&id=23
ktuvok
To rzeczywiście bardzo uporządkowany opis czynności, które trzeba wykonać żeby "po bożemu" uploadować plik na serwer. Jednak wciąż nie mam rozwiązania problemu analizy jego treści.

Jak sprawdzić, czy w kolumnach są dane odpowiedniego typu?

Jak sprawdzić, czy kolumn jest tyle ile trzeba?

Jak wczytać do bazy tylko te rekordy, które spełniają określone kryterium? (wczytywanie wszystkiego a potem kasowanie z poziomu bazy to chyba nie najlepszy pomysł...)

questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif

Pozdrawiam,
K
walker
Cytat
wczytywanie wszystkiego a potem kasowanie z poziomu bazy to chyba nie najlepszy pomysł..


Fakt to fatalny pomysłtongue.gif ... dlatego moment pomyślałem i wymyśliłem coś takiego:

  1. <? 
  2. $lines = explode( &#092;"n\", implode('',file( $_FILES['myFile']['tmp_name'])));
  3. foreach( $lines as $line ) if( sprawdz_poprawnosc( $line )) wstaw_do_bazy( $line)
  4. ?>
ktuvok
Ja póki co zrobiłem to tak:

  1. <?php
  2.  
  3. $Rekordy = file(&#092;".../plik.txt\");
  4. $IloscRekordow = count($Rekordy);
  5. if($IloscRekordow == 0)
  6. {
  7.      exit;
  8. }
  9. else
  10. {
  11.      for($i=0;$i<$IloscRekordow;$i++)
  12.      {
  13.           $Rekord = explode(&#092;"t\", $Rekordy[$i]);
  14.           $Rekord[1] = intval($Rekord[1];
  15.           // i tak dla każdego z pól rekordu
  16.           // No i tutaj przydałaby się weryfikacja wartości... 
  17.           // Ale - czy nie da się prościej??
  18.      }
  19. }
  20.  
  21. ?>


Ale powyższy kod nie zabezpiecza przed niebezpiecznymi znakami w pliku .txt, ani przed jego niewłaściwą strukturą...

questionmark.gifquestionmark.gif?,
Krzysiek
walker
No to napisz jaką strukturę ma ten plik.txt (wiem ze mniej wiecej widac po skrypcie, ale wole wiecej niz mniej;)... sądzę ze mozna by to dosc sprawnie osiągnąć przez dopasowywanie wzorców (np preg_match() )
ktuvok
Zakładana prawidłowa struktura jest następująca:

ID - INT(11) - (pole będzie pomijane)
KodProduktu - VARCHAR(32) - wyłącznie cyfry i spacje
Saldo - DOUBLE(6,2) - kwota w formacie "0.00"
DataWpisu - DATETIME - data/godzina w formacie: "2004-09-21 14:24:33"

Do bazy mają być zaciągnięte tylko te rekordy, dla których Saldo > 0.

Poszczególne wartości będą ujęte w cudzysłowy, pola rozdzielone średnikiem.

O właśnie - w moim skrypcie zakładam "\t" - czyli rozdzielenie TABulatorem. Jak to zmienić na średnik? Czy "\;" zadziała?

No i jak w ogóle sprawdzić, czy plik .txt zawiera dane wczytywalne do bazy? Czyli wiersze z danymi, każdy zakończony znakiem końca linii... Bo jeśli ktoś uploaduje plik zawierający jakikolwiek tekst, to co wtedy??

To chyba tyle...

Pozdrawiam,
Krzysiek
walker
Cytat
          $Rekord = explode("\t", $Rekordy[$i]);
          $Rekord[1] = intval($Rekord[1];
          // i tak dla każdego z pól rekordu
          // No i tutaj przydałaby się weryfikacja wartości...
          // Ale - czy nie da się prościej??


Jasne że sia da... w php mozna zaprogramowac OPTYMALNIE wszystko co jest związane z wymianą informacji klient - serwer smile.gif W twoim przypadku, tak jak myślałem, najlepsze będzie skorzystanie z wzorców

  1. <?
  2.  for($i=0;$i<$IloscRekordow;$i++)
  3.      {
  4.     if( preg_match(&#092;"/^d+tw+td+.{1}d{2}td{4}-d{2}-d{2} d{2}biggrin.gif{2}biggrin.gif{2}s/\", $Rekordy[$i])) echo \"rekord $i jest prawidłowy<br>\";
  5.     else echo &#092;"rekord $i nie jest prawidłowy<br>\";
  6.      }
  7.  
  8. ?>


Co do średnika,to wystarczy rozdzielić słowa w pliku średnikiem i zmodyfikowac wzorzec (ale myśle że tabulator to bardziej eleganckie rozwiązanie)
Pozdrawiam również,
Andrzej cool.gif

---= edytowane =----
A.. nie doczytałem ze pola mają byc w cudzysłowach - osobiście odradzam - rozdzielenie tabulatorem to moim zdaniem najlepsze rozwiązanie, ale jesli wolisz cudzyszlowy to wzorzec należy deczko zmodyfikować rolleyes.gif
-------------------------
ktuvok
Branie wartości w cudzysłowy a oddzielanie to dwie różne kwestie - zobacz np., że phpMyAdmin umożliwia eksport danych w formacie będącym kombinacją i jednej i drugiej opcji...

Czy mógłbyś mi jeszcze napisać, jak zmodyfikować mój i Twój zapis, aby móc tabulator zastąpić średnikiem?

Pozdrawiam,
Krzysiek
walker
No a moze jeszcze mam ci napisac modul analizy danych co dry.gif ,

Po prostu wstaw średniki do pliku a do wzorca podstaw zamiast tabulatorów średniki... to chyba jak sądze możesz zrobić sam cool.gif
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.