Autor Zpráva
Tomáš
Profil *
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 *

<?

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>
Tomáš
Profil *
Promíňte, nějak se mi to tam nepodařilo pěkně hodit :-(
centi
Profil
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:


for($i=0; $i<count($radek); $i++)
{
$rozdel = explode(";",$radek[$i]);

$kod = $rozdel[0];
$part_no = $rozdel[1];
$nazev = $rozdel[2];
...
Tomáš
Profil *
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 *
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
Na toto budú vhodné funkcie pre prácu s Comma Separated Files (CSV)...

http://www.php.net/manual/en/function.fgetcsv.php
llook
Profil
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 *
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
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 *
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
Pokud jsou ta data v CSV oddělená středníkama, pak využij u funkce fgetcsv ten třetí parametr:

$fp = fopen('soubor.csv', 'r');
$records = array();
while (($rec = fgetcsv($fp, 4096, ';')) !== false) {
$records[] = $rec;
}
Toto téma je uzamčeno. Odpověď nelze zaslat.

0