Avatar billede cpccorp Juniormester
22. august 2009 - 14:56 Der er 17 kommentarer og
2 løsninger

Læs en txt fil og find bestemte linier

Jeg har en tekstfil som har xxxxx antal linier og jeg skal bruge eks.
hver 4. og hver 5. linie

Hvordan???
Avatar billede cpccorp Juniormester
22. august 2009 - 14:57 #1
Jeg skal indsætte det i en mysql database
Avatar billede showsource Seniormester
22. august 2009 - 17:18 #2
Avatar billede Slettet bruger
22. august 2009 - 17:38 #3
<?php
$fil = file("txt.txt");
$linjeFire = $fil[3];
$linjeFem = $fil[4];
?>
Avatar billede cpccorp Juniormester
22. august 2009 - 17:50 #4
-> Kimsey hvad hvis jeg skal have hver 7. linie af linie 1,2 og 3
Avatar billede cpccorp Juniormester
22. august 2009 - 17:51 #5
dvs

line 1
line 2
line 3

næste sæt

line 8
line 9
line 10
etc
Avatar billede Slettet bruger
23. august 2009 - 00:45 #6
Hvis du i forvejen ved hvor mange linjer du vil have, kan det gøres således:

<?php
$antalSaet = 3;
$fil = file("txt.txt");

for($i = 0; $i < $antalSaet; $i++) {
for($ii = 0; $ii < 3; $ii++) {
  $saet[$i][$ii] = $fil[$i * 7 + $ii];
}
}
?>

Det vil lave et array kaldet saet, som indeholder en række arrays (startende fra nul), som hver indeholdende tre linjer. Altså:
$saet[1][2] = tredje linje i andet sæt.

Det kan også laves uden at kende antallet af linjer forgående, men så må jeg lige kigge på det i morgen. Jeg er for træt nu.
Avatar billede showsource Seniormester
23. august 2009 - 06:42 #7
Noget i denne stil:

<?php

$fil = file("fil.txt");
$line = 3;

for($i = 0; $i < count($fil); $i +=$line) {

echo"<p>";
echo "Linie ".$i." - ".$fil[$i]."<br />";
$next = ($i+1);
echo "Linie ".$next." - ".$fil[$next]."</p>";

}

?>
Avatar billede Slettet bruger
23. august 2009 - 12:10 #8
Ovenstående er ikke særligt smart. Først og fremmest giver det nogle helt forkerte linje, og for det andet viser det dem, i stedet for at gøre det muligt at sætte dem ind i en database.

Dette her skulle løse dine problemer. Det laver to arrays, $enkeltSaet og $dobbeltSaet. $enkeltSaet indeholder alle de valgte linjer, en efter en. $dobbeltSaet indeholder et antal arrays, hver med et sæt af linjer i.

Tilsidst dumpes $enkeltSaet og $dobbeltSaet så du kan følge med i hvad der sker:

<?php
$fil = file("fil.txt");
$antalLinjer = 3; //Antal linjer per sæt.
$mellemrumMellemLinjer = 4; //Mellemrum mellem sidste i sæt, og første i næste sæt.

for($i = 0; $i < count($fil); $i += 7) {
    for($ii = 0; $ii < 3; $ii++) {
        if(isset($fil[$i + $ii])) {
            $enkeltSaet[] = $fil[$i + $ii];
            $dobbeltSaet[$i][] = $fil[$i + $ii];
        }
    }
}
echo "<pre>";
var_dump($enkeltSaet);
echo "</br></br>";
var_dump($dobbeltSaet);
echo "</pre>";
?>
Avatar billede Slettet bruger
23. august 2009 - 12:12 #9
Skulle have brugt print_r() (print readable) i stedet for var_dump, men det er jo lige til at ændre.
Avatar billede showsource Seniormester
23. august 2009 - 12:24 #10
Jeg kan nu ikke se hvorfor det skulle være smart at lave et array førend der gemmes i DB ?
Og så med to forløkker ?

Altså gem i db i stedet for echo eller putte i array.

Og hvilke linier det bliver til, afhænger jo af hvilke der ønskes.
Avatar billede cpccorp Juniormester
23. august 2009 - 12:58 #11
Kan der ikke være problemer med størrelsen af filen, denne her er på 5 MB
Avatar billede Slettet bruger
24. august 2009 - 10:38 #12
Showsource, du ville altså høre en query mod databasen for HVER linje? Det ville da være dybt ineffektivt, og slet ikke spor smart. Det er da meget bedre at gemme linjerne i en eller anden datastruktur, og derefter proppe den ind i en blop, eller serialize den, og lægge den i en string. Så går det også meget hurtigere, især med en 5 MB fil.

Hvor stor en fil den kan tage, afhænger af serverens hukkommelse, hvor lang tid det må tage, og hvor stor et felt i databasen må være (ellers kan den jo splittes over i små stykker og de kan proppes ind individuelt). Generelt vil en 5 MB fil ikke give de store problemer.
Avatar billede showsource Seniormester
24. august 2009 - 19:18 #13
Du vil hellere lave et array først, og så gemme i db ?
Dig om det.

Men vi aner jo intet om hvad det i bund og grund er for data som skal gemmes, så der gætter vi jo på hvad vi nu kan.
Avatar billede Slettet bruger
24. august 2009 - 20:30 #14
Man kan jo have sine preferencer.

PHP er ligeglad med hvilke data der skal gemmes. Serialize() virker altid :)
Avatar billede Slettet bruger
27. august 2009 - 22:54 #15
Nåh, kan noget af det bruges?
Avatar billede cpccorp Juniormester
12. september 2009 - 16:36 #16
Jeg mixede det lidt så jeg fandt en løsning læg begge et svar
Avatar billede showsource Seniormester
13. september 2009 - 07:09 #17
ok
Avatar billede Slettet bruger
14. september 2009 - 22:03 #18
Kan vi få løsningen at se, så den kan gavne fremtidige brugere som havner i samme problemstilling?
Avatar billede cpccorp Juniormester
14. september 2009 - 22:23 #19
function countLines($filepath)
{
    /*** open the file for reading ***/
    $handle = fopen( $filepath, "r" );
    /*** set a counter ***/
    $count = 0;
    /*** loop over the file ***/
    while( fgets($handle) )
    {
        /*** increment the counter ***/
        $count++;
    }
    /*** close the file ***/
    fclose($handle);
    /*** show the total ***/
    return $count;
}

//$total = 3;
//for ($b = 1; $b <= $total; $b++) {
$count = countLines("person-1.txt");
echo($count);
$fil = file("person-1.txt");
for ($i = 0; $i <= $count; $i+=7) {
echo  $fil[$i]."-".$fil[$i+1];
}
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