Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Relacje między plikami csv
Forum PHP.pl > Forum > Przedszkole
miniol
Czy jest możliwe stworzenie relacji pomiędzy plikami CSV (czy jakimikolwiek innymi plikami)?

Mam dwa pliki:

ksiazka.csv
Kod
autor;tytuł;wydawnictwo
Jan Kowalski;Książka o zwierzętach;1
Piotr Nowak;Szydełkowanie od podstaw;4
Adam Mickiewicz;Pan Tadeusz;16


wydawnistwo.csv
Kod
id;wydawnictwo
1;PWN
4;WSiP
5;Wyd. Kolorowe


Czy można to jakoś ze sobą połączyć używając tylko php (coś a'la MySQL- JOIN)?

Narazie mam coś takiego, ale nie działa dobrze.

  1. <?php
  2.  
  3. $plik1 = file("ksiazka.csv");
  4. $plik2 = file("wydawnictwo.csv");
  5. unset($plik1[0]);
  6. unset($plik2[0]);
  7.  
  8. foreach ($plik1 as $ksiazka) {
  9. $exp = explode(";", $ksiazka);
  10. foreach ($plik2 as $wydawnictwo) {
  11. $exp2 = explode(";", $wydawnictwo);
  12. if ($exp[2] = $exp2[0]) {
  13. echo "Autor- ".$exp[0].". Tytuł- ".$exp[1].". Wydawnictwo- ".$exp2[1]."<br>\n";
  14. }
  15. }
  16. }
  17.  
  18. ?>
Crozin
Jeżeli potrzebujesz relacyjnej struktury danych to czy nie lepiej skorzystać jednak z relacyjnej bazy danych? Jeżeli zależy Ci na "lekkości" i łatwej przenośności aplikacji SQLite nada się idealnie.
miniol
Wiem, że byłoby zdecydowanie łatwiej korzystać ze zwykłej bazy. Niestety dostępne mam tylko pliki CSV, które dość często się aktualizują. Każdorazowe wgrywanie tych plików do bazy MySQL pochłania dużo więcej czasu.

Ten kod który podałem wcześniej jednak nie działa poprawnie. Ktoś mógłby na niego rzucić okiem i ewentualnie nakierować mnie na błąd? Bo podejrzewam, że niewiele mu brakuje do pełnego działania.

Obecnie daje mi taki wynik
Kod
Autor- Jan Kowalski. Tytuł- Ksišżka o zwierzętach. Wydawnictwo- PWN
Autor- Jan Kowalski. Tytuł- Ksišżka o zwierzętach. Wydawnictwo- WSiP
Autor- Jan Kowalski. Tytuł- Ksišżka o zwierzętach. Wydawnictwo- Wyd. Kolorowe
Autor- Piotr Nowak. Tytuł- Szydełkowanie od podstaw. Wydawnictwo- PWN
Autor- Piotr Nowak. Tytuł- Szydełkowanie od podstaw. Wydawnictwo- WSiP
Autor- Piotr Nowak. Tytuł- Szydełkowanie od podstaw. Wydawnictwo- Wyd. Kolorowe
Autor- Adam Mickiewicz. Tytuł- Pan Tadeusz. Wydawnictwo- PWN
Autor- Adam Mickiewicz. Tytuł- Pan Tadeusz. Wydawnictwo- WSiP
Autor- Adam Mickiewicz. Tytuł- Pan Tadeusz. Wydawnictwo- Wyd. Kolorowe


EDIT

Tak jak myślałem, niewiele brakowało. Błąd był prosty i głupi. W warunku if zamiast "==" było "=" smile.gif
Crozin
Z ciekawości... o jakich ilościach danych mówimy? Bo jeżeli jest ich tam na tyle, że baza typu MySQL nie daje rady ich obsłużyć to szczerze wątpię by użyty przez Ciebie kod dał.
miniol
Ogólnie cała baza to 150tys książek. Przy czym: autor, kategorie, wydawcy, oprawa oraz format to osobne pliki (relacyjne pliki?).

Jest jednak pewna dogodność, ponieważ poza całą ta bazą, mogę korzystać z pliku o nazwie nowości, gdzie jest około 800-1000 tytułów.
Co ważne, tylko około 1% z nich pokrywa się z moimi potrzebami (czyli liczmy 8 tytułów).

Moim zadaniem jest tylko wyselekcjonować te odpowiednie tytuły i przelać je do mojej sklepowej bazy MySQL. Cała reszta jest pomijana.

Ważne jest także to, że baza mojego sklepu bardzo różni się od tej relacyjnej, którą mam w plikach CSV, więc musiałbym stworzyć drugą bazę pośredniczącą. A to już droga okrężna moim zdaniem.

Poza tym może się zdarzyć, że wraz z nową książką dojdzie nowy autor, którego wcześniej nie miałem w swojej bazie. Dlatego też za każdym razem musiałbym uaktualniać wszystkie tabele (autorzy oprawa, kategorie itd). Myślę, że łatwiej będzie mi wyselekcjonować tylko kilka tytułów w pliku pomijając te 99% zbędnych tytułów.
Crozin
Co prawda z tego opisu nie wszystko zrozumiałem, ale z tego co widzę użycie plików CSV jest tutaj błędem. Zdecydowanie powinieneś skorzystać z RDBMS-a bo będzie to po prostu efektywniejsze. Ilość danych jest mała jak na odpowiednio przygotowaną bazę danych, jednocześnie zapewne zabójcza dla takiego prymitywnego przetwarzania w PHP jakie podałeś.

Jakbyś dokładniej opisał cały proces moglibyśmy Ci zasugerować konkretne konstrukcje i sposoby przetwarzania danych w bazie.
miniol
No to może od początku.

Mamy wewnętrzną bazę naszej hurtowni (program do obsługi magazynu), z której pobieram kod kreskowy (ISBN), tytuł, autora cenę, ilość dostępnych sztuk. Te informacje wgrywam do bazy sklepu internetowego.

Te informacje są jednak bardzo ubogie. Brak opisów, okładek, autora, wymiarów itd.

W związku z tym mamy umowę z pewną firmą, która posiada dość dużą bazę książek. Firma ta udostępnia nam swoją bazę w plikach CSV.

Za pomocą tej bazy chcę uzupełnić brakujące dane (opisy okładki, wymiary itd).

Nasza baza magazynowa pokrywa się w tylko w około 1% z tą dużą bazą którą otrzymujemy.

Ja w bazie sklepu internetowego pobieram rekordy w których kolumna "opis"=NULL a następnie chcę te rekordy zaktualizować uzupełniając je tymi danymi z plików. Ponieważ pewne jest, że jeśli w opisie nic niema, to produkt jest dopiero dodany do bazy sklepu, a więc jest nowością w naszej ofercie.

Teraz kiedy już mam wybrane kilka nowości sklepowych (które jeszcze nie mają opisu), chcę je zaktualizować. W tym celu chcę w tej dużej bazie firmy zewnętrznej poszukiwany przeze mnie ISBN. Jeśli program go znajdzie, niech zaktualizuje mój produkt w sklepie.

Jak widać teraz muszę stworzyć UPDATE do mojej sklepowej bazy wybierając dane z kilku plików.

Ważne jest także to, że zarówno nasza baza sklepowa jest aktualizowana 5 razy dziennie, oraz ta duża baza firmy zewnętrznej jest aktualizowana kilka razy dziennie.


Mam nadzieję, że teraz wiadomo o co mi chodzi. Nie przychodzi mi do głowy żaden szybszy sposób.

Wydaje mi się, że wbrew pozorom, to nie powinno trwać zbyt długo.
Jeśli podczas aktualizacji znajdzie się potrzeba zaktualizowania 8 produktów, mój programik przeleci 8 razy całą bazę nowości.csv (w której jest około 800-1000 produktów). Jeśli spotka interesujący go ISBN, to pobierze dane. Jeśli po przejrzeniu całego pliku nie znajdzie szukanego ISBNu, to sobie odpuszcza i zajmuje się kolejnym szukanym ISBNem. Podejrzewam, że nie będzie to trwało więcej niż 1sek. (aczkolwiek jeszcze tego nie sprawdzałem).
worek
lepiej zrobić to inaczej tworzysz osobną bazę do której robisz importa CSV. Następnie w mysql przeszukujesz bazę korzystając z funkcji MATCHES np. Ale przeszukanie i podmiana odbywa się już za pomocą php, natomiast serwer realizuje przeszukanie sql po czym zwraca wynik do skryptu.
miniol
Być może tak będzie lepiej jak piszesz, ale jestem początkujący i szczerze mówiąc nie słyszałem o czymś takim jak MATCHES wink.gif

Ten mój sposób nie działa najgorzej. 100 produktów updatnął w 20sek smile.gif
everth
Nie tylko będzie lepiej ale to jedyne sensowne rozwiązanie w tym wypadku. CSV to tylko nośnik danych - ty potrzebujesz silnika do ich obsługi. Mysql oferuje coś co składuje dane w formacie CSV (tu) ale prawdopodobnie to tylko nakładka na CSV import/export, wydajne to nie będzie. Jeśli jednak podlinkujesz odpowiednio pliki CSV to może uda ci się uniknąć ciągłego importu bazy, wtedy tylko odpalane co jakiś czas zapytanie regenerujące bazę w sklepie i problem z głowy.
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.