Avatar billede nicolaib Praktikant
06. september 2008 - 13:53 Der er 17 kommentarer og
2 løsninger

Læs bestemte linjer i fil

Jeg er igang med at lave et udtræk fra en fra en fil der ligger på en anden server.
Jeg kan læse hele filen med det her script.

    $filename = "http://example.com/fil.htm";
    $filepointer = fopen($filename, "r");
    $contents = fread($filepointer, 99999999);
    print(htmlentities($contents));
   
    //Her slutter indholdet og filen bliver lukket.
    fclose($filepointer);

Jeg ønsker imidlertid ikke hele filens indhold men kun bestemte linjer. Det indhold jeg ønsker er 7 tabeller der starter på linje 147 men da indholdet varierer er det ikke sikkert hvor mange linjer tabellerne spænder over.

Hvordan løser jeg det?

P.S - Jeg har fået tilladelse til at aflæse filen.
Avatar billede jaw Nybegynder
06. september 2008 - 13:56 #1
Avatar billede cronick Nybegynder
06. september 2008 - 14:47 #2
Kommer der noget efter de 7 tabeller, eller ligger de i slutningen af filen?
Avatar billede nicolaib Praktikant
06. september 2008 - 14:50 #3
Der kommer en footer som afslutter siden. Den er jeg ikke interesseret i at bruge til noget.
Avatar billede cronick Nybegynder
06. september 2008 - 15:17 #4
Så skal du formentlig bruge regular expression - også kaldet RegEx. Her kan du udtrække indhold fra en variabel (du skal derfor lægge hele filens indhold i en variabel), og ud fra nogle krav og opsætningsmuligheder, kan du få det ønskede kode.

Du kan bl.a. bruge preg_match til dette. Du kan læse lidt om funktionen her:
http://be.php.net/manual/en/function.preg-match.php
Avatar billede nicolaib Praktikant
06. september 2008 - 15:40 #5
Jeg er lidt interesseret i at prøve med file-metoden som skaber et array. Jeg forstår dog ikke helt hvilket array den danner. Jeg forventede at den ville lave et array hvor hver nøgle var en ny linje, men hvis jeg så skriver f.eks. $line[3] i forhåbningen at den udskriver linje 4 så giver den mig istedet 4. bogstav i hver linje.
Avatar billede jaw Nybegynder
06. september 2008 - 15:46 #6
Hvordan gør du det helt præcist, for som eksempel #1 i det pastede link, så skulle $lines[3] give linie 4.
Avatar billede jaw Nybegynder
06. september 2008 - 15:47 #7
Og hvordan ser en den linie helt præcist ud, hvor den skal stoppe?
Avatar billede nicolaib Praktikant
06. september 2008 - 15:59 #8
@ jaw 1 - netop det eksempel gav mig bogstav 4 i hver linje. Jeg er lige igang med at fjerne alt det der måske giver problemer i den sammenhæng. Måske hjælper det

2 - Det sidste jeg ønsker at have med er en linje hvor der blot står </table>.
Det varierer hvor langt nede på siden den står afhængig af indholdet i tabellerne

En anden mulighed er at køre det hele som en løkke og trække hver tabel ud for sig. Er der en fordel i det?
Avatar billede nicolaib Praktikant
06. september 2008 - 16:05 #9
Nu er det lykkedes mig at få det rigtige ud af filen ved hjælp af dette.

for( $i = 146; $i <= 227; $i++)
{
    echo $lines[$i];
}


Men som sagt så varierer indholdet, så hvordan får jeg den til at stoppe det rigtige sted. Der skal vel så noget RegEx til men der har jeg meget lidt viden.
Avatar billede nicolaib Praktikant
06. september 2008 - 16:16 #10
Her er en ny tanke.
Footeren er også en fast længde. Er der mulighed for at læse filen og fjerne de første 147 linjer og derefter de sidste 55 linjer? Det ville også give det rigtige indhold.
Avatar billede jaw Nybegynder
06. september 2008 - 16:27 #11
Før din sidste kommentar vil mit forslag være:

$start = 3;
while($start) {
    echo $lines[$start];
    if(preg_match("/<\/script>/i",$lines[$start])) {
        break;
    }
    $start++;
}

Efter så kan du jo køre din for-løkke som du viste 16.05.00 og så køre til (count($lines)-55)
Avatar billede jaw Nybegynder
06. september 2008 - 16:35 #12
Woups, <\/script> skal naturligvis være <\/table> - og preg_match ideen var jo cronick's, så du kan med fordel læse hans link, hvis du ikke allerede har gjort det.
Avatar billede cronick Nybegynder
06. september 2008 - 16:43 #13
Som jaw lige kom ind på, så kan du jo bare tilpasse din løkke til indholdet således:

for($i = 146; $i < (count($lines)-55); $i++)
{
    echo $lines[$i];
}

- Derved slipper du for brug af preg_match().
Avatar billede nicolaib Praktikant
06. september 2008 - 17:35 #14
@ jaw - Kan man så få returneret den linje hvor scriptet er stoppet afviklingen? Jeg forestiller mig at det er nødvendigt at køre det for alle 7 tabeller.

@ cronick - Det fungerer ihvertfald fint. Løsningen er måske lidt for enkel men nu må jeg lige prøve mig frem.
Avatar billede nicolaib Praktikant
06. september 2008 - 17:38 #15
Beklager nu tænkte jeg mig ikke lige om. Det ligger jo selvfølgelig i variablen $start allerede.
Avatar billede jaw Nybegynder
06. september 2008 - 23:19 #16
Ja, det gør det nemlig :)

Og jo enklere jo bedre, så hvis for-løkken virker tilfredsstillende ville jeg bruge den. Preg_match - eller regulære udtryk som de hedder - er meget krævende, og brugen af dem bør begrænses.
Avatar billede nicolaib Praktikant
08. september 2008 - 12:30 #17
Lægger i ikke nogle svar? Så kan jeg fordele nogle point.
Avatar billede jaw Nybegynder
08. september 2008 - 14:15 #18
Tjoh...
Avatar billede cronick Nybegynder
08. september 2008 - 18:25 #19
Svar..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester