Gå til innhold

Hjelp til å sortere csv fil


Anbefalte innlegg

Hei

 

Jeg trenger litt hjelp til å sortere en CSV fil for å så vise den i en tabell. Det skal sies at jeg kan særs lite php, så godt mulig det er enkelt :)

 

<?php
 $fp = fopen('test.csv','r') or die("can't open file");
 while($csv_line = fgetcsv($fp,1024)) {
  print '<tr class="tr">';
  for ($i = 0, $j = count($csv_line); $i < $j; $i++) {
   print '<td class="tekst">'.$csv_line[$i].'</td>';
  }
  print "</tr>\n";
 }
 fclose($fp) or die("can't close file");
 ?>

 

Jeg skulle gjerne ha fått formatert innholdet i .csv fila alfabetisk. Det spiller egentlig ingen rolle om det er en csv fil eller tekstfil egentlig. Det viktigste er at innholdet i csv fila blir sortert alfabetisk.

 

CSV fila ser slik ut:

Program,Oppe,Siste 30 min,Tid

data,data,data,data

 

Kan også fjerne header om det skulle gjøre ting enklere.

 

Har selvfølgelig prøvd å google på forhånd, uten å bli helt klok på det heller, så håper noen her inne kunne bistå litt:)

 

For de som måtte lure, så har jeg laget en del powershellscript som overvåker div stuff. Trenger derfor å vise dette på en nettside.

Lenke til kommentar
Videoannonse
Annonse

Kommer jo an på hvilket felt du ønsker å sortere etter. Skal det være første felt kan du gjøre slik:

$file_arr=file('test.csv'); // les inn hele fila i en array

unset($file_arr[0]); // fjern første linje

sort($file_arr); // sorter array

foreach ($file_arr as $key=>$line) {
echo '<tr class="tr">';

foreach (explode(',',$line) as $field) {
	echo '<td class="tekst">'.$field.'</td>';
}

echo "</tr>\n";
}

 

file() leser hele fila inn i en array. Sort() sorterer array. Den første foreach'en looper igjennom denne array'en.

explode() gjør en en tekst linje med skille tegn om til en array. Den andre foreach'en looper igjennom denne arrayen og skriver ut hvert felt.

Endret av Crowly
Lenke til kommentar

Takk for svar Crowly, skal se mer på koden i morgen, når hodet fungerer bedre etter helgens sprell :)

Laget en (googlet) en fin funksjon, med multisort, men fikk den aldri til å fungere riktig, da den kun sorterte en verdi, og ikke etter to verdier. Tror jeg kan slå sammen koden din og den andre, så mulig jeg oppnår det jeg ønsker der.

 

Paull, jo takk, det vet jeg :) Relativt stødig i powershell, men denne gangen er det ikke ønskelig å sortere selve kilden, kun visningen av den, da kilden brukes til flere ting. Mulig jeg ender opp med å dytte alt inn i en database, i stedet for flatfile. Men, det får bli en annen gang når tiden strekker mer til :)

 

Spent på om jeg lykkes i dette, da får jeg ett relativt kult gratis NOC view av min egen leilighet :)

Lenke til kommentar

Grunnen til at jeg ikke vil sortere csv fila mi er fordi jeg bruker den andre steder. Jeg kan selvfølgelig løse det i powershell ved en del sortering, men som sagt, om jeg kan (noe som tydeligvis er mulig) løse dette i php, så er det enklere for min egen del da jeg kan beholde sourcen. Jeg kan jo også bruke to forskjellige filer, men det blir fryktelig tungvindt, når det kan løses med en fil.

 

Tja, hadde jeg tatt i bruk en database, så hadde det ikke spilt noen rolle for hverken del A eller B som skal bruke dataen om hvordan den er sortert. Sortere data fra mysql kan jeg faktisk, så mulig jeg bør gå den veien.

 

Får se mer på det etter jobb :)

 

Forøvrig kom jeg hit selv:

$file = file($serverdata);
 foreach ($file as $key => $row) {
 $program[$key]  = $row[0];
 $status[$key] = $row[1];
 $status30[$key] = $row[2];
 $tid[$key] = $row[3];
 }

 array_multisort($program, SORT_ASC, $tid, Sort_numeric $file);
for($i=0; $i<count($file); $i++)
 {
   $status = explode(",", $file[$i]);
   echo "<tr class='tr'>";
   echo "<td class='tekstleft'>", $status[0],"</td><td class='tekstleftmiddle'>", $status[1],"</td><td class='tekstrightmiddle'>",$status[2],"</td><td class='tekstright'>",$status[3],"</td>";
   echo "</tr>\n";
 }
 echo "</table>";

 

Det eneste er at jeg ikke får multisort til å fungere. Jeg kan fint sortere på hver av verdiene, men jeg kan ikke sortere etter først $program, så $tid...Trodde det skulle være mulig i følge dok jeg fant, men tydeligvis har jeg bommet på ett eller annet :)

Lenke til kommentar

PHP er et skrotspråk med et forferdelig standardbibliotek, så jeg forstår at det er vanskelig. Men for meg virker det som temmelig overkill å bruke en database for å gjøre noe som burde være temmelig simpelt.

 

Hva med usort og lignende? Disse kan ta inn et predikat for sortering istedet for felter.

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...