Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php järjestely tiivistys

peg [25.01.2011 19:50:05]

#

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

Chiman [25.01.2011 20:07:33]

#

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

makumaku [25.01.2011 20:20:03]

#

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

Macro [25.01.2011 20:38:44]

#

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ä.

Metabolix [25.01.2011 21:01:28]

#

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.

peg [26.01.2011 21:56:39]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta