Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Przebudwa skryptu importu
Forum PHP.pl > Forum > PHP
kukix
Witam.

Potrzebuje przerobić skrypt importu plików csv.
W skrypcie ma być mołziwość wybierania, które kolumny majązostać zaimportowane i żeby można było zmieniać ich kolejnośc.

Jak zaplanowac taki skrypt? Macie jakieś pomysły?


np dostarczam do skryptu tablice

  1. $importuj_dane[0] = 'pole_1';
  2. $importuj_dane[1] = 'pole_5';
  3. $importuj_dane[2] = 'pole_2';
  4. $importuj_dane[3] = 'pole_9';


I jak teraz zaplanować import wg takiej kolejności i układu?
aniolekx
po co ta kolejność?
kukix
Cytat(aniolekx @ 16.03.2015, 10:55:54 ) *
po co ta kolejność?



też wydaje mi sie, że jest to zbędna sprawa, ale jednak jest taki wymóg :/


w innym przypadku mógłbym przy każdym kolejnym polu danych dać warunek czy ma być brany pod uwage, czy nie, a tutaj zmiana kolejności i sprawa się komplikuje.
Pyton_000
To dowiedz się najpierw po co takie kombinacje i co ma być rezultatem, bo może nie potrzeba wcale kombinowania
aniolekx
W tych importach które ja najczęściej pisze to pierwszy wiersz jest wierszem zawierającym nagłówki, które identyfikują kolumny, kolumny najczęściej dzielą się na dwa typy wymagane i opcjonalne, wymagane to najczęściej te które w identyfikują dany wiersz, tworząc taki upload pojawia się kilka zachowań/scenariuszy, np. jak potraktować puste komórki, tzn czy maja czyścic dane w bazie, czy jednak maja być ignorowane, itp.
kukix
czy nie można by zrobić listy funkcji


  1. function kol_aaaa() { .. /* obsługas danej kolumny*/ return $kod_sql; }
  2. function kol_bbbb() { .. /* obsługas danej kolumny*/ return $kod_sql; }
  3. function kol_ccccc() { .. /* obsługas danej kolumny*/ return $kod_sql; }


Następnie parsujemy dany plik i w zależności od potrzeby wywołujemy funkcje dla danej kolumny.
Każda funkcja może generować ostateczny kod dla bazy MySQL, którey sklepaj w całośc i wykonuje?
Pyton_000
można, potem call_user_function i lecisz, tylko czy to ma sens?
kukix
Cytat(Pyton_000 @ 17.03.2015, 13:46:44 ) *
można, potem call_user_function i lecisz, tylko czy to ma sens?



Mechanizm ten bedzie odpalany stosunkowo rzadko, wiec nie musi być super wydajny.

Chodzi o to, że beda wrzucane różne pliki i za każdym razem trzebaby je modyfikowac, a tak mozna zrobic np dwa trzy gotowe ustawienia i odpada sporo pracy.
memory
Masz pliki z csv z rożnymi kolejnościami kolumn i musisz wrzucić je do bazy w jednej słusznej kolejności ?
ctom
Cytat(kukix @ 17.03.2015, 12:14:20 ) *
Mechanizm ten bedzie odpalany stosunkowo rzadko, wiec nie musi być super wydajny.

Chodzi o to, że beda wrzucane różne pliki i za każdym razem trzebaby je modyfikowac, a tak mozna zrobic np dwa trzy gotowe ustawienia i odpada sporo pracy.


Kod
$csvArray = []; // zrzucone dane z pliku CSV do tablicy
$importuj = [1,5,2,9]; // zakładam, że to są indexy

$wynik = []; // wynik po przekonwertowaniu

array_map(function($row) use (&$wynik, $importuj) {
    $dane = array_map(function($i) use ($row){
        return isset($row[$i]) ? $row[$i] : null;
    }, $importuj);
    array_push($wynik, $dane);
}, $csvArray );

kukix
Cytat(ctom @ 17.03.2015, 22:14:06 ) *
[code]$csvArray = []; // zrzucone dane z pliku CSV do tablicy
...

problemem jest to, że dla różnych kolumn trzeba czesto wykonywać różne operacje, które tylko dla danej kolumny wystepują :/



Przygotowałem następująca koncepcje, prosze o opinie

  1.  
  2. //ustalony porzadek kolumn - takie kolumny musi mieć też plik csv.
  3.  
  4. $uklad_kolumn[0] = 'NAZWA_KOLUMNYa';
  5. $uklad_kolumn[1] = 'NAZWA_KOLUMNYc';
  6. $uklad_kolumn[2] = 'NAZWA_KOLUMNYd';
  7. $uklad_kolumn[3] = 'NAZWA_KOLUMNYb';
  8.  
  9.  
  10. //funkcje dla każdej z mozliwych kolumn
  11. //funkcje te zwracaja wycinek kodu sql, który na końcu pętli jest wykonywany
  12.  
  13. function kol_NAZWA_KOLUMNYa($dane) { /*wykonujemy operacje*/ return $wycinek_sql; }
  14. function kol_NAZWA_KOLUMNYb($dane) { /*wykonujemy operacje*/ return $wycinek_sql; }
  15. function kol_NAZWA_KOLUMNYc($dane) { /*wykonujemy operacje*/ return $wycinek_sql; }
  16. function kol_NAZWA_KOLUMNYd($dane) { /*wykonujemy operacje*/ return $wycinek_sql; }
  17. function kol_NAZWA_KOLUMNYe($dane) { /*wykonujemy operacje*/ return $wycinek_sql; }
  18. function kol_NAZWA_KOLUMNYf($dane) { /*wykonujemy operacje*/ return $wycinek_sql; }
  19.  
  20.  
  21. $uchwyt = fopen ($plik_csv,"r");
  22. while (($data = fgetcsv($uchwyt, 6000, ";")) !== FALSE) {
  23. $kod_sql = '';
  24.  
  25. //rozpisujemy wszystkie kolumny
  26. foreach ($uklad_kolumn as $key => $value) {
  27.  
  28. //wykonujemy funkcje o danej nazwie i przekazujemy jej jako parametr wartość danej kolumny
  29. $kod_sql .= call_user_func( 'kol_'.$value , $data[ $key ] );
  30.  
  31. }
  32.  
  33. sql(" WYKONUJEMY POSKŁADANE ZAPYTANIE $kod_sql ");
  34. }
  35.  
Pyton_000
Jeśli nie masz dla wszystkich kolumn funkcji to musisz sprawdzać czy masz taką metodę ew. napisać uniwersjalną metodę __call() która będzie odpalana w przypadku braku funkcji.
kukix
a wybiered
Cytat(Pyton_000 @ 31.03.2015, 18:57:03 ) *
Jeśli nie masz dla wszystkich kolumn funkcji to musisz sprawdzać czy masz taką metodę ew. napisać uniwersjalną metodę __call() która będzie odpalana w przypadku braku funkcji.



Braku funkcji nie przewiduje, ponieważ będą wybierane z listy, ale z czasem dorobie jakies zabezpieczenie.
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.