Gå til innhold

Anbefalte innlegg

Skal utvikle et script som bla skal tolke en tekststreng og dele opp den til forskjellige verdier (dere fra mobilbransjen kjenner dere sikkert igjen).

 

Jeg vet at en tekststreng som har et skilletegn som f.eks mellomrom, enkelt kan splitttes opp til enkeltverdier. Eksempel på tekstsreng: a12 x22 g32

 

Men det jeg er ute etter er muligheten for å kunne motta tekststrenger både med og uten skilletegn men som følger et fast mønster (bokstav-tall-bokstav-tall,etc...) men hvor det er både med og uten mellomrom mellom verdiene.

Eksempel på tekstsreng: a12 x22g32 eller a12 x 22g32 etc...

 

Man kan si følgende: alle tall etter en bokstav er verdien til den bokstaven.

 

Trenger ikke koden her og nå, men vil gjerne vite om dette lar seg gjøre i Perl.

Lenke til kommentar
Videoannonse
Annonse

Er det noe perl virkelig exellerer i, så er det å plukke tekststrenger i fillebiter for å få ut informasjon. Så til hovedspørsmålet ditt: Ja, med tre streker under svaret. For å sitere:

"Perl is designed to make the easy jobs easy and the hard jobs possible." -Larry Wall

 

Neste spørsmål, hvordan...

 

Jeg ser to muligheter enten en regex, sannsynligvis det lureste, dersom datastrukturen er for komplisert, kan det være at du må til med Parse::RecDescent :love:, det som ikke den klarer å plukke ut info av, finnes det ingen strukturert info i...

 

For mer info, kan du se på http://www.perldoc.com/perl5.8.4/pod/perlre.html om regexper, eller http://search.cpan.org/~dconway/Parse-RecDescent-1.94/

 

M.

Lenke til kommentar

Ja, du har vel rett, dersom det går an å bruke look-behind og look-ahead i en split-regexp (ja hvorfor skulle det ikke..)

 

Burde kunne få ut elementene med

split/(?<=\d)\s*(?=\D)/ $inndata;

 

Mao den klipper opp der hvor ingen eller flere mellomrom står etter et tall og før et ikke tall..

 

M.

 

(Må lære meg å tenke litt mindre komplisert av og til...)

 

Edit: kodekodekode:

$inndata="a12 x22g32 ";
@arry=split /(?<=\d)\s*(?=\D)/, $inndata;
foreach (@arry){
 print "$_\n";
}

Jupp, det funker. (Beklager speedster, du sa du ikke ville ha noe kode, men jeg klarte ikke å la være....)

:blush:

I neste runde klipper du opp enkeltstrengene (vha substr eller sprintf dersom det alltid er en bokstav, regexpen over bak fram dersom det kan være flere)

 

 

Hmm, tilbake til perlkoding av omregning mellom ecef og lat/lon :cool:, prøver å bruke Math::BigFloat for å få høy nok nøyaktighet (10 -12 sifre), men det er visst noe jeg ikke har forstått der (enda) :hmm:

 

M.

Endret av mysjkin
Lenke til kommentar
  • 3 uker senere...

Sliter fortsatt litt med denne.

 

Følgende funker:

 

$inndata="a12 x22g32 ";

@arry=split /(?<=\d)\s*(?=\D)/, $inndata;

foreach (@arry){

print "$_<br>\n";

}

 

Dette gir en liste som ser slik ut:

 

a12

x22

g32

 

Dette er forsåvidt greit, men hvordan skiller jeg ut bokstaver og tall?

 

Poenget er at bokstaven skal være "navnet på verdien" og tallet skal være selve verdien. Slik at jeg kan lagre bokstaven i en kolonne og tallet i en annen kolonne i samme rad i databasen.

 

tabellen skal se slik ut:

 

a|12

x|2

g|32

 

Eller: $bokstav|$tall

 

En annen ting jeg også trenger er at det ikke skal tillates fler enn en bokstav pr tall og heller ikke like bokstaver.

 

Noen som vil hjelpe?

Endret av 356speedster
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...