Topic: Import iš tekstinio failo į mysql

Sveiki. Turiu šiokią tokią problemėlę. Turiu import scriptą, kuris duomenis iš tekstinio failo perkelia į duombazę. Tačiau vykdant scriptą įsikelia tik maža dalis duomenų. Gal žinote kas negerai? P.S iš 18000 eilučių importuojama 1800.

Re: Import iš tekstinio failo į mysql

Tai import skriptas parašytas netinkamai arba duomenų bazės schema netinkama.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Import iš tekstinio failo į mysql

kai bandau importint meta šį errorą
Fatal error: Out of memory (allocated 356777984) (tried to allocate 8001 bytes) in /home/euromanas/domains/fifa-pro.xz.lt/public_html/import_players.php on line 49

Re: Import iš tekstinio failo į mysql

<?php
ini_set("memory_limit","512M");
// nbanba

require_once "maincore.php";

$table_name = "zaidejai";
$file_name = "players.txt";

class CsvImporter {
    private $fp;
    private $parse_header;
    private $header;
    private $delimiter;
    private $length;

    function __construct($file_name, $parse_header=false, $delimiter="\t", $length=8000)
    {
        $this->fp = fopen($file_name, "r");
        $this->parse_header = $parse_header;
        $this->delimiter = $delimiter;
        $this->length = $length;
        $this->lines = $lines;

        if ($this->parse_header)
        {
           $this->header = fgetcsv($this->fp, $this->length, $this->delimiter);
        }

    }

    function __destruct()
    {
        if ($this->fp)
        {
            fclose($this->fp);
        }
    }

    function get($max_lines=0)
    {
        $data = array();

        if ($max_lines > 0)
            $line_count = 0;
        else
            $line_count = -1;

        while ($line_count < $max_lines && ($row = fgetcsv($this->fp, $this->length, $this->delimiter)) !== FALSE)
        {
            if ($this->parse_header)
            {
                foreach ($this->header as $i => $heading_i)
                {
                    $row_new[$heading_i] = $row[$i];
                }
                $data[] = $row_new;
            }
            else
            {
                $data[] = $row;
            }

            if ($max_lines > 0)
                $line_count++;
        }
        return $data;
    }
}

$importer = new CsvImporter($file_name, true);

while($details = $importer->get(30000)) {
dbquery("INSERT INTO ".$table_name." VALUES ()");
$result = dbquery("SELECT * FROM ".$table_name);
$countcols = count(dbarray($result));
dbquery("TRUNCATE TABLE ".$table_name);

$countrows = count($details);

for ($k = 0; $k < $countrows; ++$k) {

$values = "";
$i = 0;

foreach ($details[$k] as &$value) {
    ++$i;
    $countrecs = count($details[0]);
    $countdiff = $countcols - $countrecs;
    $value = iconv("UTF-8", "windows-1257", $value);

    if ($i == $countrecs) {
    $values .= "'".$value."'";
        for ($j = 0; $j < $countdiff; ++$j) {
            $values .= ", ''";
        }
    } else {
    $values .= "'".$value."', ";
    }
}

dbquery("INSERT INTO ".$table_name." VALUES (".$values.")");

}
}

?>

Re: Import iš tekstinio failo į mysql

o php.ini faile nustatytas dydis memory_limit is defaulto?

var_dump(0 == 'tekstas'); // TRUE. ar zinai kodel? :)

Re: Import iš tekstinio failo į mysql

kur php.ini rast galima ?

Re: Import iš tekstinio failo į mysql

phpinfo(); ir ziuri kur randasi.

var_dump(0 == 'tekstas'); // TRUE. ar zinai kodel? :)

Re: Import iš tekstinio failo į mysql

bet nėra tokios direktorijos FTP. Naudoju serveriai.lt

Re: Import iš tekstinio failo į mysql

tai ikelinek mazais kiekiais. gal kas tures geresniu ideju nei mano nes ten manau bus koks 64mb limitas gal dar maziau

var_dump(0 == 'tekstas'); // TRUE. ar zinai kodel? :)

Re: Import iš tekstinio failo į mysql

...
$importer->get(30000))
...

Pabandyk sumažint skaičių ...

O šiaip tai nesuprantu kam taip sudėtingai daryti importavimą iš CSV, kai MySQL'e galima tai atlikti per vieną užklausą ir duomenis tiesiai suimportuoti iš failo be jokio PHP.
Netgi ir dirbant su PHP yra specialios funkcijos darbui su CSV formatu.

Re: Import iš tekstinio failo į mysql

minde wrote:

...
$importer->get(30000))
...

Pabandyk sumažint skaičių ...

O šiaip tai nesuprantu kam taip sudėtingai daryti importavimą iš CSV, kai MySQL'e galima tai atlikti per vieną užklausą ir duomenis tiesiai suimportuoti iš failo be jokio PHP.
Netgi ir dirbant su PHP yra specialios funkcijos darbui su CSV formatu.

o del memory_limit buvau kazkiek teisus ar cia visai nusisnekejau?

var_dump(0 == 'tekstas'); // TRUE. ar zinai kodel? :)

Re: Import iš tekstinio failo į mysql

Na teisus tiek, kad nuskaitomi duomenys + kiti veiksmai netelpa į PHP skirtą atmintį.

Atminties limito padidinimas padeda jeigu turi tokias teisės ir tiek atminties, kiek reikia (kartais su labai kreivu kodu atminties padidinimas nieko neišspręs, nes programa gali jos naudoti begalo daug).

Re: Import iš tekstinio failo į mysql

kaip ta memory edit pakeist ir kaip csv importint jei turi tik txt faila

Re: Import iš tekstinio failo į mysql

Jeigu tame txt faile iš tikro yra CSV formatas, tai sukelk tą failą per FTP į serverį, o tada per phpMyAdmin prisidetink komandą "LOAD DATA ..."

Pilna dokumentacija: http://dev.mysql.com/doc/refman/5.1/en/load-data.html kur rasi kaip nustatyti visus parametrus, kad teisingai sukeltų duomenis.

Taip pat iki kokio dydžio buvai sumažinęs mano minėta skaičių?

15 (edited by VYCKA 2011-07-11 10:07:01)

Re: Import iš tekstinio failo į mysql

iki 5000 sumazinau tada kelia. bet ir tai sukelia tik 2000 daugiau nebedade i table

Re: Import iš tekstinio failo į mysql

čiia veikia du limitai:
a) atminties apribojimas, kas neleidžia nuskaityti didelio duomenų kiekio kiekvienoje porcijoje;
b) laiko limitas, kas neleidžia scriptui būti vykdimam ilgiau nei kažkiek sekundžių (gal 30);

Todėl pasinaudok LOAD DATA komanda... arba susikelk viską lokaliame kompe, kur nėr atminties/laiko apribojimų, o tada suimportuosi jau SQL failą.

Taip pat atliekant importus su dideliais duomenų kiekiais, kur duomenų schemoje yra ribojantys raktai - patartina tuos raktus/indeksus atjungti, o įjungti tik po importo pabaigos.

Re: Import iš tekstinio failo į mysql

tarkim darausi CSV failą. sintaksę visą beveik padariau,  bet pačiame eilutės priekyje neišeis replacint skaičiaus :D. Gal žinote kaip galėčiau kiekvienos eilutės pradžioje pridėti " ?

Re: Import iš tekstinio failo į mysql

VYCKA wrote:

bet pačiame eilutės priekyje neišeis replacint skaičiaus :D

Kodėl "neišeis"?

VYCKA wrote:

Gal žinote kaip galėčiau kiekvienos eilutės pradžioje pridėti " ?

Sukonkretink ką, kokioje aplinkoje tu nori padaryt...

19 (edited by VYCKA 2011-07-11 10:39:51)

Re: Import iš tekstinio failo į mysql

pasidariau taip naudojant notepad++:

1;388;9;32;2009;0
1;805;12;32;2012;0
1;7826;11;29;2014;0
1;8473;7;32;2010;0
1;51105;10;7;2012;0
1;113343;1;0;2010;0
1;134783;27;32;2011;0
1;134906;6;33;2010;0
1;147777;23;31;2012;0
1;157304;5;4;2013;0

ar gerai?

Re: Import iš tekstinio failo į mysql

VYCKA wrote:

ar gerai?

Man asmeniškai jokio skirtumo (-;