Avatar billede henriklaursen Nybegynder
17. november 2003 - 12:52 Der er 21 kommentarer og
1 løsning

Opdeling af streng på komma

Hej..
jeg har et lille problem.
jeg har denne streng.

"12138722","Standard, The","Carman","149.00","1993","0","R 02",0,0,0

den skal jeg have komma sepereret ind i et array.
problemet er bare at titlen (Standard, The)
står med et komma. kan man undgå dette komma ?
Avatar billede erikjacobsen Ekspert
17. november 2003 - 12:57 #1
Dit konkrete eksempel kan løses med

$s= '"12138722","Standard, The","Carman","149.00","1993","0","R 02",0,0,0';

preg_match_all('/"[^"]*"|[^,]+/',$s,$r);

print "<xmp>\n";
print_r($r);
print "</xmp>\n";

som udskriver

            [0] => "12138722"
            [1] => "Standard, The"
            [2] => "Carman"
            [3] => "149.00"
            [4] => "1993"
            [5] => "0"
            [6] => "R 02"
            [7] => 0
            [8] => 0
            [9] => 0

Det bliver en kende mere kompliceret hvis der også står "-ere i teksterne.
Avatar billede henriklaursen Nybegynder
17. november 2003 - 13:07 #2
okay.  - det er bare kanon..
hvordan er det så lige jeg finder længden af et array ?
Avatar billede henriklaursen Nybegynder
17. november 2003 - 13:07 #3
smider du lige et svar ?
Avatar billede Slettet bruger
17. november 2003 - 13:11 #4
Et arrays længde kan findes med count() eller sizeof()
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:14 #5
Joh, men, lad os nu lige ....

Er du sikker på at dette er den mest generelle form du kommer ud for?
Avatar billede henriklaursen Nybegynder
17. november 2003 - 13:18 #6
sidder lige og leger lidt det du har lavet..
er det helt forkert antaget, at $r er selve arrayet..

jeg kan nemlig ikke få den til at udskrive, når jeg kører den igennem en for løkke

- ang. formen, så skulle den se sådan ud hvergang, men kan man måske lave en kontrol yderligere hvor, den ser bort fra "-erne
Avatar billede Slettet bruger
17. november 2003 - 13:18 #7
Det ligner noget DVD film prisliste, så mon ikke der kan snige sig et - ind?
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:21 #8
Ok, det er $r[0][0], $r[0][1], $r[0][2], ... osc
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:22 #9
og størrelsen får du med  count($r[0])
Avatar billede henriklaursen Nybegynder
17. november 2003 - 13:28 #10
Jeg har lige været ved at kontrollere hele teksten..
der er nogle linjer, hvori der står "-ere..

har du en løsning til denne ?
der skal nok komme flere point i puljen så :-)
Avatar billede fsconsult.dk Nybegynder
17. november 2003 - 13:28 #11
lige et spørgsmål uden for kategori: hedder du tilfældigvis "frank" til mellemnavn?
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:29 #12
Hvordan ser det ude med de "-ere ?
Avatar billede henriklaursen Nybegynder
17. november 2003 - 13:30 #13
her er et eks.
"46076322","Bach: Magnificat - ""Ich habe genug""","Naxos","59.75","1998","0","R 16",1,0,0
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:31 #14
Ja, nemlig - de er dublerede ;) 2 secs - og nej da, du skal ikke give flere point
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:39 #15
Prøv at lege med dette:

  function f($a,$b) {
    return str_replace('""','"',$a.$b);
  }

$s= '"12138722","Standard, ""nope"" The","Carman","149.00","1993","0","R 02",0,0,0';

preg_match_all('/"(([^"]|"")*)"|([^,]+)/',$s,$r);
$a = array_map("f",$r[1],$r[3]);

print "<xmp>\n";
print_r($a);
print "</xmp>\n";

for ($i=0;$i<count($a);$i++) {
  print "$i: $a[$i]<br>\n";
}

Det udskriver i for-løkken til sidst:

0: 12138722<br>
1: Standard, "nope" The<br>
2: Carman<br>
3: 149.00<br>
4: 1993<br>
5: 0<br>
6: R 02<br>
7: 0<br>
8: 0<br>
9: 0<br>
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:44 #16
Og så er det altid sjovere at lave selv, men du kan faktisk bruge
http://www.php.net/manual/en/function.fgetcsv.php
til det samme. Det er bare lidt kedelig, når der er en indbygget funktion
til det.
Avatar billede erikjacobsen Ekspert
17. november 2003 - 13:49 #17
Eksempel



  $f=fopen("fil.csv","r");

while ($data = fgetcsv ($f, 1000, ",", '"')) {
    $num = count ($data);
    print "<p> $num fields in line $row: <br>\n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        print $data[$c] . "<br>\n";
    }
}
fclose ($f);



I en lidt ældre PHP er "-delimiter fast og du skal nøjes med
while ($data = fgetcsv ($f, 1000, ",")) {
Avatar billede henriklaursen Nybegynder
17. november 2003 - 14:50 #18
tak for hjælpen.. :-)
nu kører det :-)
smider du lige et svar ?
Avatar billede erikjacobsen Ekspert
17. november 2003 - 14:57 #19
hvad bruger du så?
Avatar billede henriklaursen Nybegynder
17. november 2003 - 15:15 #20
det hele virkede jo efter hensigten ..
men jeg valgte den nemme løsning, og brugte fgetcsv();
Avatar billede erikjacobsen Ekspert
17. november 2003 - 15:17 #21
;) Øv - regulære udtryk er sjovere... Men nu er da et sted at henvise til
i fremtiden, og så kan man vælge hvad man vil!
Avatar billede henriklaursen Nybegynder
17. november 2003 - 15:34 #22
jeps..
du skal i hvert fald have tak for hjælpen.
jeg har lært rigtig meget ved det..
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Specialister til Netværksoperations til Forsvarets nye Digitale Backbone

BEC Financial Technologies

Development Manager for Document Lifecycle

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Analytiker til Security Operations Center ved Cyberdivisionen

HusCompagniet A/S

Senior data engineer

Politiets Efterretningstjeneste

Teknisk IT-projektleder, der skaber fremdrift i PET