Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Porównanie pliku xls z bazą MySQL..., jak wyfiltrować pozycje nieistniejące w bazie..
kukix
post
Post #1





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

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


Witam.
Mam plik csv, który zawiera 10 kolumn...
czwarta kolumna, to kod, który chce porównać z kodem w bazie danych...

Pytanie jest takie. Jak najlepiej wyfiltrować z pliku csv pozycje, które nie istnieją w bazie?

Myślałem o dwóch rozwiązaniach:
1. Załadowac plik do tabeli tymczasowej, następnie usunąć pozycje (zapytaniem SQL) z tabeli tymczasowej, które powtarzają sie w docelowej tabeli. następnie tą tabele tymczasową wrzucić do pliku csv...

2. w pętli każdą pozycje, która załadowana jest z pliku csv od razu porównywać z baza docelową i jeśli pozycja nie istnieje, to dodac ją do zmiennej.. na końcu tą zmienną wrzucić do pliku csv do pobrania...

Problem w tym, że w rozwiazaniu 1. nei wiem, jak napisać zapytanie, które sprawdziłoby nieistniejące produkty.
Rozwiązanie 2. nie jest praktyczne, ponieważ baza jak i plik mają po 28 000 pozycji... operacja ta "zabiłaby" serwer...

Prosze o podpowiedź.... jak to sprawnie zrobić? Może istnieje jakaś funckja,metoda, która porównywałaby plik csv z baza MySQL..?

Ten post edytował kukix 26.10.2007, 12:41:52
Go to the top of the page
+Quote Post
starr
post
Post #2





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 16.10.2007

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


Co to za server, który zabije 28000 zapytań, które tak naprawdę będą wykonanne tylko raz na jakiś czas. Jeśli nawet, to przecież takie porównanie możesz zrobić lokalnie, a nie na serverze. Po tym pierwszym razie będziesz porównywał tylko nowe dane, których nie będzie juz 28 000. Chyba, że czegoś nie zrozumiałem !

Ostatnio pisałem taki skrypt, który wyciąg bankowy w formacie csv ładuje do bazy, a następnie z nastepnego wyciągu csv doodaje do bazy dane, których jeszcze nie ma w bazie. Jesli chcesz kod napisz na mojej stronie wiadomość, za pomocą formularza kontaktowego.

starr
----------------------------------------------
www.aleproste.pl
Go to the top of the page
+Quote Post
Darti
post
Post #3





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


Wykorzystaj metodę nr 2 i ustaw
ini_set('max_execution_time',0); albo
set_time_limit (0);
i spokojnie, nie zabijesz serwera ( no chyba ze to 486 albo wolniejsze cudo)
Go to the top of the page
+Quote Post
kukix
post
Post #4





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

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


Cytat(starr @ 26.10.2007, 21:23:25 ) *
Co to za server, który zabije 28000 zapytań, które tak naprawdę będą wykonanne tylko raz na jakiś czas. Jeśli nawet, to przecież takie porównanie możesz zrobić lokalnie, a nie na serverze. Po tym pierwszym razie będziesz porównywał tylko nowe dane, których nie będzie juz 28 000. Chyba, że czegoś nie zrozumiałem !

Ostatnio pisałem taki skrypt, który wyciąg bankowy w formacie csv ładuje do bazy, a następnie z nastepnego wyciągu csv doodaje do bazy dane, których jeszcze nie ma w bazie. Jesli chcesz kod napisz na mojej stronie wiadomość, za pomocą formularza kontaktowego.


28 000 zapytan do bazy z 28 000 pozycjami... unieruchomi to serwer home.pl na kilka minut... (przynajmniej strona glówna przestaje w tym momencie odpowiadać)... lokalne porównanie odpadam, poniewaz będzie to robione na wielu, często przypadkowych komputerach, na których nie będzie zainstalowany serwer...

Za każdym razem będe porównywał wszystkie 28 000 pozycji...a nawet więcej..

jest tak.. mam w bazie około 28 000 pozycji... po kilku dniach porzysylaja mi plik CSV w którym jest 28 500 pozycji... zadaniem skryptu jest "wylapanie tych nowych 500 pozycji.."
Go to the top of the page
+Quote Post
Darti
post
Post #5





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


U mnie sluzy stary celeronek 500 MHz + 256 ramu i dysk w PIO4.
28000 insertów wykonał w nieco ponad 31 sekund.
i tyle samo selectów w 8 sekund. Poslugiwalem sie wartosciami typu integer z przedzialu rand(10000,999999999999999999999999).

Moze dobrym pomyslem byłoby zrobienie tabeli z tylko jedną kolumną (rzeczoną czwartą) i ustawić ją jako index.
Co kilka tysięcy insertów, selectów skorzystać z funkcji sleep.

no i kilka wskazówek w manualu mysql'a

Ten post edytował Darti 28.10.2007, 22:37:03
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 16:27