Avatar billede jv Nybegynder
12. marts 2002 - 20:25 Der er 31 kommentarer

Flatfile åbning

Jeg skal åbne en txt fil med data, der er opdelt således:

"1234","","Navn","62","0","0","","",0,"","text

mere text",1,"54",""

Denne tekst vil jeg gerne hive ud i nogle tables, så det kan vises på en hjemmeside eller printes ud.

Da der kan være linieskift (ses ovenfor ved "text" og "mere text") er det ikke muligt, blot at lade PHP lave en ny table hver gang der kommer en ny linie.

I hver enkel udtræk er der 14 stk. "".

Håber I forstår hvad jeg mener og kan hjælpe mig lidt på vej.
Avatar billede thomashove Nybegynder
12. marts 2002 - 20:45 #1
brug funktionerne file(); og explode();

http://www.php.net/manual/en/function.file.php

http://www.php.net/manual/en/function.explode.php

f.eks.

$file_array=file(fil.txt);

for ($y = 0; $y < count($file_array); $y++)
              {
                $row=current($file_array);
                    $dividedtext = explode(",",$row);
                    $new_row['felt_1'] = trim($dividedtext[0]);
                    $new_row['felt_2'] = trim($dividedtext[1]);
                osv...
                    $final_array[]=$new_row;
                    next($file_array);               
              }

hermed får du et multi array (final_array) indeholdende felterne fra din tekstfil
Avatar billede thomashove Nybegynder
12. marts 2002 - 20:46 #2
dette array kan du herefter "pakke ud" vha. extract();

extract($final_array[0]);
Avatar billede jv Nybegynder
12. marts 2002 - 23:59 #3
Uha, det kan jeg slet ikke få til at virke.
Prøvede en simpel test:

<?php
$file_array=file(test.txt);

for ($y = 0; $y < count($file_array); $y++)
              {
                $row=current($file_array);
                    $dividedtext = explode(",",$row);
                    $new_row['felt_1'] = trim($dividedtext[0]);
                    $new_row['felt_2'] = trim($dividedtext[1]);
                    $final_array[]=$new_row;
                    next($file_array);               
              }
?>

Så smider den fluks disse fejl i hovedet på mig:

Warning: file("testtxt") - No such file or directory in f:\site\test.php on line 2

Warning: Variable passed to current() is not an array or object in f:\site\test.php on line 6

Warning: Variable passed to next() is not an array or object in f:\site\test.php on line 11

Det der undrer mig mest er umiddelbart, at den ikke forstår punktummet i test.txt.
Avatar billede tipsen Nybegynder
13. marts 2002 - 00:50 #4
Det er nok en god idé at prøve $file_array = file('test.txt'); i stedet for! Du kan læse mere om file() på http://www.php.net/manual/en/function.file.php
Avatar billede jv Nybegynder
13. marts 2002 - 00:56 #5
Ja, det var bedre.

Jeg har også tilføjet extract funktionen, men hvordan kommer jeg videre og får den til at echo?
Avatar billede tipsen Nybegynder
13. marts 2002 - 02:32 #6
thomas: Hvordan har du taget højde for at felterne kan have værdier der indeholder linieskift?
Avatar billede thomashove Nybegynder
13. marts 2002 - 09:13 #7
her kommer den forkromede løsning (håber jeg ;o) )

har en txt - fil (test.txt) der indeholder

thomas,hoves,test

endnu,en,lille,test

kør derefter dette php kode...

<?
$file_array=file('test.txt');

for ($y = 0; $y < count($file_array); $y++)
{
    $row=trim(current($file_array));
    if ($row<>"")
    {
        $dividedtext = explode(",",$row);
        echo(count($dividedtext));
        $new_row['felt_1'] = trim($dividedtext[0]);
        $new_row['felt_2'] = trim($dividedtext[1]);
        $new_row['felt_3'] = trim($dividedtext[2]);
        $new_row['felt_4'] = trim($dividedtext[3]);
        $final_array[]=$new_row;       
    }
      next($file_array);   
}


//------printer indholdet af dit arraay ud til test brug
echo("<PRE>");
print_r($final_array);
echo("</PRE>");


//--- extracter dine værdier
for ($y = 0; $y < count($final_array); $y++)
{
  extract($final_array[$y]);   
  echo($felt_1);
  echo("<br>");
  echo($felt_2);
  echo("<br>");
  echo($felt_3);
  echo("<br>");
  echo($felt_4);
}
?>
Avatar billede jv Nybegynder
13. marts 2002 - 13:42 #8
Jeg har fået det meste til at virke, men det går helt galt, når der er liniebrud (hvilket tipsen og var inde på).
Avatar billede thomashove Nybegynder
13. marts 2002 - 13:54 #9
hvad skriver den så...

linierne

    $row=trim(current($file_array));
    if ($row<>"")

burde tage højde for dette
Avatar billede jv Nybegynder
13. marts 2002 - 14:11 #10
Jeg har lavet det så den skriver ud i tables og hvis der er linieskift, så laver den en helt ny <td>. Prøv at lave linieskift i din mere simple udgave og se hvordan det ser ud.
Avatar billede jv Nybegynder
13. marts 2002 - 14:14 #11
Der er også et mindre problem i det, der er nogle af teksterne er komma. Derved laver den også en ny.
Avatar billede thomashove Nybegynder
13. marts 2002 - 14:25 #12
hvis der i teksterne er komma bliver du vel nødt til at bruge en anden seperator - f.eks semikolon
Avatar billede jv Nybegynder
13. marts 2002 - 14:26 #13
Det prøver jeg lige.
Avatar billede jv Nybegynder
13. marts 2002 - 14:32 #14
Det løste ihvertfald problemet med komma i sætninger, men problemet med liniebrud er der stadig.
Avatar billede tipsen Nybegynder
13. marts 2002 - 14:47 #15
det er ikke generelt nødvendigt med en anden seperator, da alle variable er indeholdt i "". Ligegyldigt hvilken anden seperator man vælger, kan man måske altid risikere at møde den i variablene...
Avatar billede jv Nybegynder
13. marts 2002 - 16:04 #16
Nu har jeg kigget lidt nærmere på hvad det er den gør, hvis der er liniebrud til stede.

Nedenstående burde være i EET array, men bliver delt helt ud i 3 stk.

Array
(
    [0] => Array
        (
            [felt_1] => "1234"
            [felt_2] => ""
            [felt_3] => "test"
            [felt_4] => "11"
            [felt_5] => "0"
            [felt_6] => "0,45"
            [felt_7] => ""
            [felt_8] => ""
            [felt_9] => 3
            [felt_10] => "Noget tekst her, som er helt fint"
            [felt_11] => "Her er der en lang tekst. Nu laves der så et liniebrud
            [felt_12] =>
            [felt_13] =>
            [felt_14] =>
        )

    [1] => Array
        (
            [felt_1] => Hvorefter vi ender helt hernede
            [felt_2] =>
            [felt_3] =>
            [felt_4] =>
            [felt_5] =>
            [felt_6] =>
            [felt_7] =>
            [felt_8] =>
            [felt_9] =>
            [felt_10] =>
            [felt_11] =>
            [felt_12] =>
            [felt_13] =>
            [felt_14] =>
        )

    [2] => Array
        (
            [felt_1] => "
            [felt_2] => 1
            [felt_3] => "663"
            [felt_4] => "0"
            [felt_5] =>
            [felt_6] =>
            [felt_7] =>
            [felt_8] =>
            [felt_9] =>
            [felt_10] =>
            [felt_11] =>
            [felt_12] =>
            [felt_13] =>
            [felt_14] =>
        )
Avatar billede tipsen Nybegynder
13. marts 2002 - 16:30 #17
Det kunne måske være en idé at overvejen funktionen nl2br(), som konverter linieskift til html-kode?
Avatar billede jv Nybegynder
13. marts 2002 - 17:07 #18
Hvor vil du anvende den?
Avatar billede tipsen Nybegynder
13. marts 2002 - 19:28 #19
inden du smider dataene over i textfilen måske...
Avatar billede jv Nybegynder
13. marts 2002 - 23:53 #20
Kan du ikke vise et kode eksempel på det? Tak
Avatar billede tipsen Nybegynder
14. marts 2002 - 00:15 #21
Hvis du forklarer, hvordan du får teksten over i tekstfilen og hvad du efterfølgende skal bruge den tekst til - evt. suppleret med den kode du har i forvejen, kan jeg forklare, hvad jeg mener - det kan så måske supplere den løsning thomas har lavet!
Avatar billede jv Nybegynder
14. marts 2002 - 00:27 #22
Teksten bliver eksporteret fra en database via et ASP script. Det skal bruges til en forenings website, hvor der er tale om medlemsdataer i dette tilfælde.

Hvis du kan vise det på thomas kode, så vil det være fint.
Avatar billede tipsen Nybegynder
14. marts 2002 - 00:32 #23
Den idé jeg havde var, at gøre det på de data der bliver skrevet til tekstfilen - dvs. det skal gøres allerede i asp-scriptet og det kender jeg ikke noget til...

Det er den måde jeg selv behandler linieskift, som folk indtaster i min gæstebog - de bliver konverteret til <br>, der fungerer som ny linie i html... - så slipper jeg for at tage højde for det i efterfølgende kode!
Avatar billede jv Nybegynder
14. marts 2002 - 00:49 #24
Jeg kan ikke pille ved det asp script på nogen måde. Det er et firma der har lavet det og det indgår i et større system.
Avatar billede tipsen Nybegynder
14. marts 2002 - 00:55 #25
ok - så må du bare løse det på anden vis - thomas' forslag ser udmærket ud...
Avatar billede jv Nybegynder
14. marts 2002 - 01:03 #26
Hans forslag virker ikke, desværre.
Avatar billede tipsen Nybegynder
14. marts 2002 - 01:05 #27
Det skal nok bare modificeres lidt... - det er lidt noget høker med de linieskift midt i teksten... - det havde været smartere, hvis de var konverteret til html-kode på det tidspunkt...
Avatar billede jv Nybegynder
14. marts 2002 - 01:38 #28
Ja, det har du ret i, men det er desværre ikke muligt. Mon ikke der findes en løsning.
Avatar billede tipsen Nybegynder
14. marts 2002 - 01:42 #29
der findes helt klart en løsning - der skal bare modificeres lidt på thomas' kode - så fungerer det :-) - god arbejdslyst!
Avatar billede thomashove Nybegynder
14. marts 2002 - 10:02 #30
noget du kunne gøre var at "lytte" på antallet af "" som du siger der altid er 14 af og dermed først vente med at smide det endelige resultat i final array til du har 14....
Avatar billede jv Nybegynder
14. marts 2002 - 13:16 #31
Det er desværre ikke alle sammen der har "" omkring (ved ikke hvorfor).
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