| 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: 4 roky
|
|||
0