Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Porównanie pliku xls z bazą MySQL...
Forum PHP.pl > Forum > PHP
kukix
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..?
starr
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
Darti
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)
kukix
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.."
Darti
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
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.