Autor | Zpráva | ||
---|---|---|---|
Tomáš Profil * |
#1 · Zasláno: 27. 3. 2005, 16:27:03
Mám script, který načítá data se souboru, a pak je ukládá do databáze, ale je to to strašně pomalý
(soubor-200 řádků trvalo zpracovat asi 2min!) a to nechci ani domyslet jak dlouho by trvalo zpracování souboru o 10 000 řádcích! <? require "../funkce.php"; conn(); set_time_limit(0); if(isset($soubor)) { echo "<pre>"; if(move_uploaded_file($soubor, "../aktualizace/polozky.csv")) { $radek = file("../aktualizace/polozky.csv"); for($i=0; $i<count($radek); $i++) { $kod = chop(ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\1',"$radek[$i]")); $part_no = chop(ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\2',"$radek[$i]")); $nazev = chop(ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\3',"$radek[$i]")); $popis = chop(preg_replace('/(")\\1{1,}/', '\\1',ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\4',"$radek[$i]"))); // odstraní se ještě zdvojené uvozovky $cena = chop(ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\5',"$radek[$i]")); $vyrobce = chop(ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\6',"$radek[$i]")); $slozka = chop(ereg_replace('(.*);(.*);(.*);"(.*)";(.*);(.*);(.*);', '\\7',"$radek[$i]")); // ještě odstraním konec řádku if($kod != "" && $nazev != "" && $cena != "" && $slozka != "") { $sql = mysql_query("SELECT id FROM polozky WHERE kod_s='$slozka' AND type='F'"); // ověření, zda existuje zložka, kam budeme přidávat $pocet1 = mysql_num_rows($sql); $id_slozky = mysql_fetch_row($sql); // načte id složky, do které se bude přidávat $sql2 = mysql_query("SELECT id, cena FROM polozky WHERE kod_s='$kod' AND type='L'"); // zjistí, jestli je v databázi přidávaná položka $pocet2 = mysql_num_rows($sql2); $row = mysql_fetch_row($sql2); // načte id složky, do které se bude přidávat if($pocet1 == "1" && $pocet2 == "0") // položka není v databázi, takže se ji pokusíme přidat { $sql2 = mysql_query("INSERT INTO polozky VALUES (null, 'L', '$kod', '$part_no', '$nazev', '$vyrobce', '$popis', '24', '$cena', '1.35', '', '')"); // přidá položku do databáze $id_pol = Mysql_Insert_Id(); $sql3 = mysql_query("INSERT INTO tree VALUES ('$id_pol', '$id_slozky[0]')"); // položka se ještě vloží do určené složky echo "$kod -- přidáno\n"; } elseif($pocet1 == "1" && $pocet2 == "1") // položka je v databázi tak ji aspoň aktualizujeme { if($row[1] != number_format($cena, 2, ".", "")) { $sql = mysql_query("UPDATE polozky SET cena='$cena' WHERE kod_s='$kod' AND type='L'"); echo "$kod -- aktualizováno\n"; } } else { } } } } echo "\nPřidávání položek a aktualizace dat byla dokončena\n"; echo "</pre>"; unlink("../aktualizace/polozky.csv"); // smažeme aktualizační soubor mysql_close($spojeni); // odpojíme se od databáze exit; // ukončíme program } ?> <html> <head> <meta http-equiv='Content-language' content='cs'> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <title>Automat</title> </head> <body> <h1>AUTOMAT - automatické přidávání a aktualizování položek</h1> Vyberte soubor ze kterého chcete získat data. (musí být ve formátu CSV a nesmí v něm být žádné hlavičky)<br><br> <pre> Příklad: ACK064V;;64MB SDRAM PC133 V-Data (3yrs warranty);"";89;OEM;SDRAM; </pre> <form method="POST" enctype="multipart/form-data"> <input type="file" name="soubor"> <input type="SUBMIT" value="Aktualizovat"> </form> </body> </html> Tak tohle je ten script kdo zná lepší řešení, tak mi prosím poraďte. Díky Tom |
||
Tomáš Profil * |
#2 · Zasláno: 27. 3. 2005, 16:35:03
|
||
Tomáš Profil * |
#3 · Zasláno: 27. 3. 2005, 16:35:55
Promíňte, nějak se mi to tam nepodařilo pěkně hodit :-(
|
||
centi Profil |
#4 · Zasláno: 27. 3. 2005, 16:39:03
Takže údaje v tom súbore sú rozdelené v riadku podľa znaku ; ok. Ale prečo ich načítavaš pomocou reg. výrazov veru neviem. Ja by som ich načítal takto:
|
||
Tomáš Profil * |
#5 · Zasláno: 27. 3. 2005, 16:42:13
Jo zapoměl jsem dodat, že ten soubor vypadá asi takto:
ACK064V;seriové číslo;64MB SDRAM PC133 V-Data (3yrs warranty);"Popis, kde mohou;být i nějaké středníky a "" uvozovky";89;OEM;SDRAM; Tak proto. Pomocí explode by to nešlo! |
||
Tomáš Profil * |
#6 · Zasláno: 27. 3. 2005, 18:13:59
Před hodinou jsem spustil tento script na 3000 řádkovém souboru, ale nedokončil se(nenaběhla ani výsledková část). IE mi to hodilo stránku nelze nalézt (přesně po hodině).
|
||
izsak Profil |
#7 · Zasláno: 27. 3. 2005, 18:28:47
Na toto budú vhodné funkcie pre prácu s Comma Separated Files (CSV)...
http://www.php.net/manual/en/function.fgetcsv.php |
||
llook Profil |
#8 · Zasláno: 27. 3. 2005, 19:24:50
Zrovna tohle je nejlepší načítat pomocí fgetcsv, jak píše izsak. Akorát jako delimiter dáš středník.
Ten kód je plný všech možných zpomalovačů, například "$radek[$i]" je lepší zapsat jako $radek[$i] (bez uvozovek), ale nejvíc to patrně zpomaluje ta spousta ereg_replace - pokaždé se znovu parsuje a porovnává celý regulár místo toho, aby se to jednou porovnalo funkcí ereg a pak vytahalo z třetího parametru. |
||
Tomáš Profil * |
#9 · Zasláno: 27. 3. 2005, 23:04:09
Dobře, ale jak zajistím, aby se mi to nerozdělilo u popisu, kde můžou být i středníky?
|
||
Leo Profil |
#10 · Zasláno: 27. 3. 2005, 23:30:48
Nechce se mi cist cely zdrojak a snazit se pochopit co dela, ale zkuste misto ereg fci preg fce, jsou rychlejsi, ale prvotni problem je spatny format vstupnich dat, co treba skutecne csv? Leo
|
||
Tomáš Profil * |
#11 · Zasláno: 27. 3. 2005, 23:35:53
Z velkoskladu si nechávám mailem poslat data v csv, ale ten je oddělený středníkama a né čárkama.
Skusím to udělat pomocí fce ereg, nebo preg (můsím nastudovat). |
||
llook Profil |
#12 · Zasláno: 28. 3. 2005, 16:43:31 · Upravil/a: llook
Pokud jsou ta data v CSV oddělená středníkama, pak využij u funkce fgetcsv ten třetí parametr:
|
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0