contare record uguali in file csv

  • Creatore Discussione Creatore Discussione lucasky
  • Data di inizio Data di inizio

lucasky

Nuovo Utente
11 Mar 2020
3
0
1
Salve, ho un piccolo database CSV fatto in questa maniera:

Pippo,data,ora,OK,
Pluto,data,ora,OK,
Pluto,data,ora,OK,
Pippo,data,ora,KO,
Pippo,data,ora,OK,
Pippo,data,ora,OK,
Pluto,data,ora,KO,
ecc....

Con il codice sotto riporto i dati OK in una tabella secondo ordine inserimento.
La mia domanda è: come faccio ad ottenere quante volte compare Pippo in ok, quante volte Pluto in ok?
Vorrei ottenere una cosa del genere:

Pippo = 3 volte
Pluto = 2 volte
ecc...
PHP:
<?php

$fd= fopen ('il_mio_file.csv', "r");
while (!feof ($fd))
{
$riga=fgets($fd, 4096);
if ($riga != ' ')
{
$arr=split(',', $riga);

if ($arr[3] == ''OK"){

echo 'table>';
echo '<tr>';
echo '<td>' . $arr[0] . '</td>';
echo '<td>' . $arr[1] . '</td>';
echo '<td>' . $arr[2] . '</td>';
echo '</tr>';
echo '</table>';
}
}
}

fclose($fd);
?>
 
Ultima modifica di un moderatore:
@lucasky

Da regolamento del forum, come tutti noi sei tenuto ad usare il tag [ html].........[/html] senza spazio quando posti del codice html o il tag appropriato per altro codice, oppure la funzione codice dalla barra degli strumenti

box inserisci.png


Inoltre IMPORTANTE: Prima di creare una nuova discussione o di rispondere alle discussioni esistenti sei tenuto e ricordati di leggere attentamente il Regolamento del Forum e l'eventuale regolamento specifico della sezione!
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
 
@lucasky

Da regolamento del forum, come tutti noi sei tenuto ad usare il tag [ html].........[/html] senza spazio quando posti del codice html o il tag appropriato per altro codice, oppure la funzione codice dalla barra degli strumenti

box inserisci.png


Inoltre IMPORTANTE: Prima di creare una nuova discussione o di rispondere alle discussioni esistenti sei tenuto e ricordati di leggere attentamente il Regolamento del Forum e l'eventuale regolamento specifico della sezione!
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
Ok grazie
 
Ciao, tu stai eseguendo il parsing direttamente dalla risorsa aperta ma forse converrebbe riversare inizialmente in un array tutti i dati recuperati, così da poterli manipolare più facilmente per le eventuali operazioni che vuoi andare a fare.

Una volta che i dati sono in un array multidimensionale puoi eseguire intanto un filtro, con array_filter, per avere un array dei soli elementi "OK", quindi puoi ottenere, con array_column, un array degli elementi della sola prima colonna (quella dei nomi) e, a quel punto, con array_count_values puoi ottenere il conteggio dei singoli nomi.

Qui un esempio rielaborato partendo dalle tue indicazioni:
PHP:
<?php
$fileURL = "il_mio_file.csv";

$arr = array_map("str_getcsv", file($fileURL, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));

$arrElementiOK = array_filter($arr, function($el){ return $el[3] == "OK"; });

$arrColNomi = array_column($arrElementiOK, 0);

$arrConteggioNomi = array_count_values($arrColNomi);

foreach ($arrConteggioNomi as $key => $value) {
    echo "$key = $value volte<br>";
}

echo "<hr>";

echo "<table>";
foreach ($arrElementiOK as $el) {
    echo "<tr>";
    echo "<td>$el[0]</td>";
    echo "<td>$el[1]</td>";
    echo "<td>$el[2]</td>";
    echo "</tr>";
}
echo "</table>";
?>

Vedi se può esserti utile, fai sapere :)
 
Ciao, tu stai eseguendo il parsing direttamente dalla risorsa aperta ma forse converrebbe riversare inizialmente in un array tutti i dati recuperati, così da poterli manipolare più facilmente per le eventuali operazioni che vuoi andare a fare.

Una volta che i dati sono in un array multidimensionale puoi eseguire intanto un filtro, con array_filter, per avere un array dei soli elementi "OK", quindi puoi ottenere, con array_column, un array degli elementi della sola prima colonna (quella dei nomi) e, a quel punto, con array_count_values puoi ottenere il conteggio dei singoli nomi.

Qui un esempio rielaborato partendo dalle tue indicazioni:
PHP:
<?php
$fileURL = "il_mio_file.csv";

$arr = array_map("str_getcsv", file($fileURL, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));

$arrElementiOK = array_filter($arr, function($el){ return $el[3] == "OK"; });

$arrColNomi = array_column($arrElementiOK, 0);

$arrConteggioNomi = array_count_values($arrColNomi);

foreach ($arrConteggioNomi as $key => $value) {
    echo "$key = $value volte<br>";
}

echo "<hr>";

echo "<table>";
foreach ($arrElementiOK as $el) {
    echo "<tr>";
    echo "<td>$el[0]</td>";
    echo "<td>$el[1]</td>";
    echo "<td>$el[2]</td>";
    echo "</tr>";
}
echo "</table>";
?>

Vedi se può esserti utile, fai sapere :)

Grazie, effettivamente la prima parte fa al caso mio perché restituisce il numero di volte in ok. La seconda parte, nella tabella non capisco bene perché appaiono più volte gli stessi nomi con conteggi non reali. Comunque mi basterebbe la prima parte fino a <hr> aggiungendo di poter visualizzare non solo il record 0 ma anche il resto della riga e possibilmente in ordine decrescente.

Esempio: file CSV fatto in questo modo:

Nome,Cognome,23-03-2019,08:38,OK,
ecc...

Il risultato dovrebbe stare in una tabella così:
Nome Cognome 1volta
ecc...
tutto il ordine decrescente.

Grazie in anticipo
 
Ultima modifica:

Discussioni simili