Autor Zpráva
Pepe425454
Profil
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
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
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
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
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
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
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. :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0