Avatar billede leif Seniormester
20. august 2006 - 10:38 Der er 34 kommentarer og
2 løsninger

Splitte streng

Hej,

Har en sjov opgave. Jeg har en streng fra et sygesikringskort som jeg skal have delt op i Fornavn/Mellemnavn, Efternavn, Adresse, Postnr, CPR-Nr

Det er noget med at fra Tegn 2 frem til ^ er Efternavn og fra ^ og frem til tegn nummer 35 og fra 36 til 69 er det adressen og 73 til 76 er postnr så kommer der et ?; og tegn nummer 9 - 18 efter ?; er CPRnr.

De nemme er selvfølgelig når det bare er fra Tegn x til x, men når den skal stoppe lige før ^ hvordan gør man det ?

Eller hvis du har lyst må du gerne lave hele funktionen.

På forhånd tak

/Leif
Avatar billede iss Novice
20. august 2006 - 10:57 #1
Den "nemme" måde ville være explode ellers kan du kigge på preg_match.
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 11:22 #2
Kom med et par eksempler på hvordan sådan en streng kunne se ud.
Avatar billede leif Seniormester
20. august 2006 - 11:25 #3
%EFTERNAVN^FORNAVN MELLEMNAVN      GADENAVN 1 2 TH                  0001564?;0000000099999999990000000000000000000?

Håber den får alle mellemrum med osv.
Avatar billede leif Seniormester
20. august 2006 - 11:25 #4
Det gjorde den ikke, 2 sek. smider lige en txt fil op.
Avatar billede leif Seniormester
20. august 2006 - 11:27 #5
Avatar billede leif Seniormester
20. august 2006 - 11:35 #6
Normalt vil alle 0 være forskellige tal.
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 11:45 #7
Prøv at lege med det her:

<?php
$c = file_get_contents("streng.txt");
preg_match_all("/%(.*?)\^(.*?)\s{2,}(.*?)\s{2,}(\d+)\?;(\d+)\?/", $c, $r, PREG_SET_ORDER);

echo "<pre>";
print_r($r);
echo "</pre>";
?>

Når du køre scriptet kan du se hvordan arrayet er indrettet. $r[0][1] er efternavnet på den første person, $r[0][2] er fornavnet osv osv.

Men problemet er lidt at finde ud af hvornår en ny del af strengen starter og stopper, når det kun er afgrænset med mellemrum. I min kode stopper den når der er 2 mellemrum eller mere.

Men prøv det :-)
Avatar billede nielle Nybegynder
20. august 2006 - 11:56 #8
Mit bud:

$data = "%EFTERNAVN^FORNAVN MELLEMNAVN      GADENAVN 1 2 TH                  0001564?;0000000099999999990000000000000000000?";
$navn = trim(substr($data, 1, 35));
list($efternavn, $fornavn) = explode("^", $navn);
$adresse = trim(substr($data, 35, 34));
$postnr = trim(substr(79, 7), "0");

Jeg kan ikke lige gennemskue hvor man finder CPR-nummert i stringen, men det kan vel laves efter samme princip.
Avatar billede leif Seniormester
20. august 2006 - 12:09 #9
9999999999 er CPRnr og 1564 er portnr.
Avatar billede nielle Nybegynder
20. august 2006 - 12:12 #10
Jeg havde gennemskuet postnummeret, men var lidt usikker mht. CPR.

Umiddelbart ville jeg mene at du burde være i stand til at lave den sidste linje kode. Korrekt?
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 12:15 #11
Nu kan det godt være jeg spørger dumt, men hvorfor er cpr-nummeret omgivet af en masse 0'er?
Avatar billede leif Seniormester
20. august 2006 - 12:16 #12
Normalt er det omgivet af en masse andre tal !
Avatar billede nielle Nybegynder
20. august 2006 - 12:16 #13
Ved nærmere eftertanke er det nok ikke så smart at lave den trim() på postnummeret. Den vil jo også tage eventuelle nuller fra enden af postnummeret, som i 2000 Frederiksberg.
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 12:19 #14
leif: starter cpr'nummeret altid ved tegn 9 i den række af tal?
Avatar billede nielle Nybegynder
20. august 2006 - 12:20 #15
Hvis du ellers er ikkere på at postnummeret alteid er på 4 cifre:

$data = "%EFTERNAVN^FORNAVN MELLEMNAVN      GADENAVN 1 2 TH                  0001564?;0000000099999999990000000000000000000?";
$navn = trim(substr($data, 1, 35));
list($efternavn, $fornavn) = explode("^", $navn);
$adresse = trim(substr($data, 35, 34));
$postnr = substr(71, 4);
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 12:22 #16
Nielle: Grønland og Færøerne  har kun 3 cifre
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 12:25 #17
Her er et nyt bud fra mig:

<?php
$c = file_get_contents("streng.txt");
preg_match_all("/%(.*?)\^(.*?)\s{2,}(.*?)\s{2,}0*(\d+)\?;\d{8}(\d{10})\d*\?/", $c, $r, PREG_SET_ORDER);

echo "<pre>";
print_r($r);
echo "</pre>";
?>
Avatar billede nielle Nybegynder
20. august 2006 - 12:25 #18
De Grønlandske postnumer er mig bekendt 39xx. Det er kun de Færøske som er på 3.
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 12:27 #19
Ja, du har ret, det er kun Færøerne, men alligevel :-)
Avatar billede nielle Nybegynder
20. august 2006 - 12:28 #20
Det gør jo heller ikke noget, efter som man hurtigt kan smide en if på koden og så lave særbehandling hvis det udtrukne post-nummer starter med "0".
Avatar billede gizmo-gizmo Nybegynder
20. august 2006 - 12:30 #21
nielle: Er det ikke smartere bare at bruge regex? Er der noget jeg har overset (det er der som regel :-)
Avatar billede nielle Nybegynder
20. august 2006 - 12:32 #22
Normalt har jeg intet imod regulære udtryk, men hver ting til sit formål.

Når man har data, hvor pladserne er fastlagt, bør man (efter min mening) bruge substr() til at udtrække delene. Derefter er der kun særtilfældet med navnet, og dette klare en explode() nemt.
Avatar billede leif Seniormester
20. august 2006 - 12:34 #23
Postnummret vil blive konstrolleret ud fra den liste PostDanmark leverer.

gizmo-gizmo -> Ja, starter altid på samme plads
Avatar billede leif Seniormester
20. august 2006 - 16:40 #24
gizmo-gizmo -> Jeg får 7 cifre i postnr ? Den er ikke altid omgivet af 0
Avatar billede nielle Nybegynder
20. august 2006 - 16:50 #25
Har du prøvet min kode endnu?
Avatar billede leif Seniormester
20. august 2006 - 16:51 #26
Jeg er ved at teste din
Avatar billede leif Seniormester
20. august 2006 - 16:53 #27
Der mangler jeg postnr og cprnr nu, når jeg bruger kort til aflæsning.
Avatar billede nielle Nybegynder
20. august 2006 - 16:57 #28
Postnummer er der. Jeg har før spørgt om du ikke selv kunne finde ud af at udvide koden til CPR-nummer, men du har ikke rigtigt svaret. Des dkulle ellers være nemt nok - blot noget med at tælle frem til hvor det første ciffer starter, og så bruge en substr() til at finde "derfra" og så de næste 10.
Avatar billede leif Seniormester
20. august 2006 - 16:58 #29
Stupid me ! Jeg har fundet fejlen siden din (nielle) ikke fungerer !

$postnr = substr(71, 4); skal selvfølgelig være $postnr = substr($data, 71, 4);
Avatar billede nielle Nybegynder
20. august 2006 - 16:59 #30
Jeg må visl hellere stemmei og sige "suipid me" :^|
Avatar billede nielle Nybegynder
20. august 2006 - 17:06 #31
... hvis jeg ellers tog mig sammen og rettede for de værste tastefejl ;^)
Avatar billede leif Seniormester
20. august 2006 - 17:34 #32
nielle -> Vil du smide et svar ! Jeg har valgt at bruge din løsning, da jeg blandt andet synes den er nemmere at overskue og ændre-
Avatar billede nielle Nybegynder
20. august 2006 - 17:40 #33
Svar :^)
Avatar billede nielle Nybegynder
30. august 2006 - 07:53 #34
Så mangler du bare at acceptere svaret :^)
Avatar billede leif Seniormester
02. oktober 2006 - 19:31 #35
Bedre sent end aldrig
Avatar billede nielle Nybegynder
03. oktober 2006 - 18:03 #36
Takker for point :^)
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