Autor | Zpráva | ||
---|---|---|---|
Pepe425454 Profil |
#1 · Zasláno: 9. 2. 2022, 19:38:28
Uspořádání dat v souboru CSV, příklad:
primarni klic hodnota A hodnota B 999 4548644 788787544 999 78741 6565344 999 784 4884 555 996 56464 111 444 8454 Ahoj. Prosím o pomoc. Potřebuju v PHP zpracovat soubor CSV, zredukovat opakující se primární klíč na jeden řádek a všechny hodnoty přidružený k tomuto klíči sečíst a pak teprve odeslat do tabulky v databázi Nevíte jak na to? Výsledek: primarni klic hodnota A hodnota B 999 soucet soucet 555 996 56464 111 444 8454 |
||
juriad Profil |
#2 · Zasláno: 9. 2. 2022, 19:45:08
Vlož si to do pomocné tabulky, a pak můžeš použít jednoduchý insert, který hodnoty sečte:
INSERT INTO tabulka SELECT id, sum(hodnotaA), sum(hodnotaB) FROM pomocna GROUP BY id |
||
Pepe425454 Profil |
juriad:
Díky. Jdu to vyzkoušet. juriad: Ahoj. Ještě jednou Ti děkuju za odpověď. Takhle jsem to zapsal do PHP: $sql_odeslat = "INSERT INTO pomocna SELECT primarni_klic, sum(hodnota_A), sum(hodnota_B) FROM pomocna GROUP BY primarni_klic VALUES ( '".$hodnota_z_radku_souboru[0]."','".$hodnota_z_radku_souboru[1]."','".$hodnota_z_radku_souboru[2]."' )"; Píše mi to, ze mám chybu v syntaxi SQL: Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VALUES ( '1111','929000','967056' )' at line 1 in C:\xampp\htdocs\moje\pomocna.php:62 Stack trace: #0 C:\xampp\htdocs\moje\pomocna.php(62): mysqli_query(Object(mysqli), 'INSERT INTO pom...') #1 {main} thrown in C:\xampp\htdocs\moje\pomocna.php on line 62 Nevíš, prosím, co s tím? Ještě se mrknu do dokumentace, ale v tomhle jsem začátečník, takže v tom mám zatím zmatek. |
||
blaaablaaa Profil |
#4 · Zasláno: 10. 2. 2022, 07:21:03
Pepe425454:
Do tabulky pomocná si nejdříve vložíš všechny řádky i s opakujícím se primárním klíčem (tady ho nebudeš mít jako primární). V dalším kroku pak pomocí juriadova příkazu data správně sečteš a vložíš do správné tabulky. Pomocnou poté smažeš. |
||
Pepe425454 Profil |
#5 · Zasláno: 11. 2. 2022, 21:17:08
blaaablaaa:
Díky za odpověď. Včera jsem tomu nejdřív nerozuměl, ale nakonec jsem to pochopil a dal to dohromady. Takže díky vám oběma. Ještě bych se chtěl zeptat, jestli to jde řešit taky jinak. Třeba kódem v PHP, bez pomocné tabulky v databázi. Nedá se to řešit nějak přes pole? |
||
juriad Profil |
Samozřejmě dá.
Předpokládejme, že máme vsup v $radky_ze_souboru :
$redukovane = []; # pole jehož klíč bude primární klíč foreach ($radky_ze_souboru as $radek) { if (isset($redukovane[$radek[0]])) { # pokud už jsme takový řádek viděli $redukovany = $redukovane[$radek[0]] $redukovany[1] += $radek[1]; # přičteme hodnotu A $redukovany[2] += $radek[2]; # přičteme hodnotu B } else { # tento řádek je nový $redukovane[$radek[0]] = $radek; } } A pak do databáze vložíš $redukovane namísto $radky_ze_souboru .
Je na tobě, co ti přijde přehlednější. Neřekl jsi nám, jakým způsobem čteš a zpracováváš ten CSV soubor, takže možná tato odpověď bude obtížně použitelná. |
||
Pepe425454 Profil |
#7 · Zasláno: 12. 2. 2022, 12:10:39
juriad:
Ahoj. Děkuji Ti za odpověď. Čtení a zpracování CSV souboru řeším takhle: Jestli to chápu správně, pole $redukovane a cyklus foreach vložím do svého cyklu while? $soubor = "data.csv"; $otevriSoubor = fopen ( $soubor, "r" ); while ( ( $radekSouboru_hodnota = fgetcsv ( $soubor, 1000, ";" ) ) !== FALSE ) { $sql_extrahuj_a_vlozDoTabulky = "INSERT INTO tabulka ( sloupecTabulky_A, sloupecTabulky_B, sloupecTabulky_C ) VALUES ( '".$radekSouboru_hodnota[0]."','".$radekSouboru_hodnota[1]."','".$radekSouboru_hodnota[2]."' )"; $odesli_sql = mysqli_query ( $spoj_se_s_databazi, $sql_extrahuj_a_vlozDoTabulky ); } fclose ( $soubor ); |
||
Keeehi Profil |
#8 · Zasláno: 12. 2. 2022, 12:39:32
No, spíš takto
$soubor = "data.csv"; $otevriSoubor = fopen ( $soubor, "r" ); $redukovane = []; while ( ( $radekSouboru_hodnota = fgetcsv ( $soubor, 0, ";" ) ) !== FALSE ) { if (isset($redukovane[$radek[0]])) { # pokud už jsme takový řádek viděli $redukovane[$radek[0]][1] += $radek[1]; # přičteme hodnotu A $redukovane[$radek[0]][2] += $radek[2]; # přičteme hodnotu B } else { # tento řádek je nový $redukovane[$radek[0]] = $radek; } } fclose ( $soubor ); foreach($redukovane as $radek) { mysqli_query ( $spoj_se_s_databazi, "INSERT INTO tabulka ( sloupecTabulky_A, sloupecTabulky_B, sloupecTabulky_C ) VALUES ( '$radek[0]', $radek[1], $radek[2])"); } |
||
Pepe425454 Profil |
#9 · Zasláno: 12. 2. 2022, 13:21:49
Keeehi:
Paráda! To je fakt hustý! :-D Přesně to jsem chtěl! Díky, díky, díky! :-) Mám radost, protože takhle nemusím v databázi vytvářet pomocnou tabulku. :-) |
||
Časová prodleva: 2 roky
|
0