Autor | Zpráva | ||
---|---|---|---|
Andrej.B Profil |
Zdravim,
rad by som vyriesil Upload a Update do DB z CSV. Mam jednoduchy kod pre zaciatok, ze ako mi bude generovat zostavu na Insert: $insert = "INSERT into sklad (`polozka`, `miesto_sklad`, `miesto_sklad2`, `lot`, `miesto_sklad3`, `mnozstvo_sklad`) values \n"; $row = 0; $filename=$_FILES["file"]["tmp_name"]; $file = fopen($filename, "r"); while (($getData = fgetcsv($file, False, ";")) !== FALSE) { if($row == 0){ $row++; continue; } // hlavicky alebo bez $num = count($getData); $row++; $insert .= "("; for ($c=0; $c < $num; $c++) { $insert .= "'".$getData[$c]."', "; } $i++; $insert = rtrim($insert, ', '); // poslednu ciarku vo values odstranime $insert .= "),"; // uzavrieme riadok values $insert .= "\n"; // aby to bolo pekne pri teste } echo $insert; fclose($file); Vygeneruje mi to tento kod INSERT into sklad (`polozka`, `miesto_sklad`, `miesto_sklad2`, `lot`, `miesto_sklad3`, `mnozstvo_sklad`) values ('00015/30A0-EIR', 'A', 'A08BL4', 'R000102200', 'A', '19'), ('10062/07Z', 'J', 'J00', 'I000012165', 'A', '25745'), ('14202/15/10', 'B', 'B03CP1', 'I000014475', 'A', '1142'), ('92030/01/09A0', 'A', 'A03IL1', '1,70706E+11', 'A', '62'), ('92030/02/09A0', 'B', 'B05CP4', '1,70706E+11', 'A', '108'), ('92030/02/09S0', 'A', 'A11AP1', 'I000008175', 'A', '19'), ('AC004PIET7040/BUR', 'A', 'A00EXP', 'M000054499', 'A', '100'), ('AC004PIET7040/BUR', 'B', 'B01BL3', 'R000152705', 'A', '218'), ('AC004PIET7040/BUR', 'C', 'IFSBAL', 'R000093255', 'A', '45'), skoro dokonale, len sa potrebujem zbavit poslednej cirky ako som sa dokazal zbavit poslednej ciarky priamo pre ten ktory Values $insert = rtrim($insert, ', '); // poslednu ciarku vo values ('AC004PIET7040/BUR', 'C', 'IFSBAL', 'R000093255', 'A', '45'), Ako na to? Diky |
||
anonym_ Profil * |
#2 · Zasláno: 2. 11. 2022, 13:21:12
Andrej.B:
A otázka, problém, cokoliv je kde? Funguje to, nefunguje (a co to případně vyhazuje za chybu)? |
||
Andrej.B Profil |
#3 · Zasláno: 2. 11. 2022, 13:22:42
anonym:
som klikol miesto nahladu na Poslat spravu |
||
Kajman Profil |
anonym:
Když dáte formátovací enter z řádku 32 na začátek dat - tedy před závorku na řádku 20, tak řádku 36 můžete použít zase rtrim na čárku. Edit: nebo klidně jen $insert = rtrim($insert, ",\n"); Data musíte escapovat na řádku 24 a hodnota '1,70706E+11' taky nevypadá úplně dokonale. |
||
Andrej.B Profil |
#5 · Zasláno: 2. 11. 2022, 14:14:31
Kajman:
tak to som nepredpokladal veru takto. Formátoval som si to len pre vizuál a netušil som, ze si to takto skomplikujem. Data sa este budu kontrolovat. Inak takto vypada cislo 170705650002 /1,70706E+11/, ked sa preulozi v Exceli /holt excel :)/, hodi to ako scientific number. Len som si vymazaval riadky, aby som to pri testoch nemal velke. Diky moc |
||
Kajman Profil |
Ještě si musíte kontrolovat, že jeden insert není delší než povoluje nastavení serveru.
Takže při hodně řádcích musíte data rozdělit na více insertů a nemít jen jeden. Osobně bych ale data tahal rovnou z csv, je to jednodušší na programování (je menší šance, že tam zanesete chybu třeba tím chybějícím escapováním) a nemusí se řešit limit délky dotazu. Navíc by to mělo být rychlejší. dev.mysql.com/doc/refman/8.0/en/load-data.html |
||
Andrej.B Profil |
#7 · Zasláno: 3. 11. 2022, 07:33:18
csv ma tych riadkov max cca 10 000, takze celkom v pohode vladze. 0.588 sekundy
Skusil som to priamo cez ten Load DATA a ten ukazuje 0.092 sekundy. Musim sa na to pozriet blizsie. Dakujem LOAD DATA INFILE './sklad.csv' INTO TABLE sklad |
||
Časová prodleva: 2 roky
|
0