Tuollaisesta .txt tiedostosta pitäisi saada poimittua esittäjät yhdenkerran. Pitääkö käydä silmukassa vai onko jotain muuta konstia, sillä tiedostossa on yli 11000 riviä. esittäjiä arviolta yli 1000.
Marc_Anthony_-_Tragedy.mp3
Marc_Anthony_-_When_I_Dream_At_Night.mp3
Marc_Anthony_-_You_Belong_With_Me.mp3
Mari_Rantasila_-_Vain_rakkaus.mp3
Mariah_Carey_-_All_I_Want_For_Christmas.mp3
Mariah_Carey_-_Heartbreaker_(Radio_Edit)_(Fea.mp3
Mariah_Carey_-_Hero.mp3
Mariah_Carey__Whitney_Houston_-_When_You_Believe.mp3
Silmukassa tuon voi käydä. Katkaiset rivin explode-funktiolla "_-_"-kohdasta, lisäät näin saadun esittäjän uuteen taulukkoon, jos sitä ei ole siellä jo ennestään. Lopputuloksena jokainen esittäjä on taulukossa kerran.
Jos käytössä olisi esim. linux, homma toimisi näin:
$ cat kappaleet.txt | awk -F'_-_' '{ print $1 }' | sort | uniq Marc_Anthony Mariah_Carey Mariah_Carey__Whitney_Houston Mari_Rantasila
Itse varmaan kokeilisin jotain tyyliin....(huom täysin testaamatonta)
$taulu = file("kappaleet.txt"); for ($i=0; $i < count($taulu); $i++) $taulu[$i] = strtok($taulu[$i], "_-_"); array_unique($taulu);
Ja sen jälkeen esittäjät ovat muuttujassa $taulu
makumaku tarkotti varmaan (edit: ei hajuakaan mitä tuo funktio tekee, voi toimiakkin)
$taulu = file("kappaleet.txt"); $valmisTaulu = array(); for($i = 0; $i < count($taulu); $i++) { $valmisTaulu[$i] = explode("_-_", $taulu[$i]); }
En kyllä usko, että PHP pystyy käsittelemään 11 tuhatta riviä tietoa 30 sekunnissa, vai pystyykö?
Ja tuskin kannattaa joka kerralla käydä koko tiedostoa läpi, vaan kannattaa tehdä esimerkiksi tietokanta johon tallennat nuo. Sitten voit helposti hakea vaikka biisin tai artistin nimellä.
Komentorivillä tekisin näin:
cat kappaleet.txt | sed 's/_-_/\t/' | cut -f 1 | sort -u > artistit.txt
Jos artistit ovat valmiiksi järjestyksessä, tämä on nopeampi:
cat kappaleet.txt | sed 's/_-_/\t/' | cut -f 1 | uniq > artistit.txt
makumaku ja Macro, PHP-viritelmänne eivät toimi oikein, molemmissa on aika pahoja puutteita.
$tulos = array(); foreach (file("kappaleet.txt") as $rivi) { $i = strpos($rivi, "_-_"); if ($i) { $tulos[substr($rivi, 0, $i)] = true; } } $tulos = array_keys($tulos); file_put_contents("artistit.txt", implode("\n", $tulos). "\n");
Jos artistit ovat valmiiksi järjestyksessä, pitäisi olla nopeampaa vain tarkistaa, onko rivin artisti eri kuin edellisellä rivillä:
$vanha = null; $tulos = array(); foreach (file("kappaleet.txt") as $rivi) { $i = strpos($rivi, "_-_"); if ($i) { $uusi = substr($rivi, 0, $i); if ($uusi !== $vanha) { $tulos[] = $vanha = $uusi; } } } file_put_contents("artistit.txt", implode("\n", $tulos). "\n");
(Edit: Eipä näytä tulevan lainkaan nopeuseroa. Ilmeisesti PHP:ssä on siis hyvin toteutettu hajautustaulu tai jokin yllättävä pullonkaula tavallisessa taulukossa.)
Macro kirjoitti:
En kyllä usko, että PHP pystyy käsittelemään 11 tuhatta riviä tietoa 30 sekunnissa, vai pystyykö?
Aika erikoiselta määrältä kuulostaa. Oma arvioni on, että PHP käsittelisi nykykoneella sekunnissa noin sadantuhannen rivin setin.
Kiitän, kyllä minulle tämä Metabolixin vaihtoehto on hyvä.
Array_unigue on minulle käyttämätön, mutta sitäkin kyllä kiinnostaa
kokeilla ajankanssa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.