/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Regular Expressions
Fra : Jimmy


Dato : 28-11-02 23:32

Hej

Jeg er helt ny i Perl og har derfor et spørgsmål.

Jeg skal hente alle SMS på et SIM-kort vha. et GSM-modem.
Jeg vil derfor gerne lægge enkelte dele af de enkelte SMS i en database.

Problemet er, at jeg ikke ved, om man skal bruge RegExp til at hive de
relevante data ud?

Se til sidst for et ekesempel på to SMS.

Det er følgende felter i hver SMS der er interessante for mig:

index #0
SC address: '4540390999'
Originating address: '45xxxxxxxx'
SC timestamp: 11/24/2002 08:55:52 PM (+0100)
User data: 'Dette er en SMS fra mig selv.'

Hvad foreslår I, at jeg gør?

Mvh
Jimmy



index #0
---------------------------------------------------------------------------
Message type: SMS-DELIVER
SC address: '4540390999'
More messages to send: 1
Reply path: 0
User data header indicator: 0
Status report indication: 0
Originating address: '45xxxxxxxx'
Protocol identifier: 0x0
Data coding scheme: default alphabet
SC timestamp: 11/24/2002 08:55:52 PM (+0100)
User data length: 160
User data header: 0x
User data: 'Dette er en SMS fra mig selv.'
---------------------------------------------------------------------------

index #1
---------------------------------------------------------------------------
Message type: SMS-DELIVER
SC address: '4540390999'
More messages to send: 1
Reply path: 0
User data header indicator: 0
Status report indication: 0
Originating address: '45xxxxxxxx'
Protocol identifier: 0x0
Data coding scheme: default alphabet
SC timestamp: 11/24/2002 08:56:53 PM (+0100)
User data length: 7
User data header: 0x
User data: 'IEJ ÆØÅ'
---------------------------------------------------------------------------




 
 
Lars Balker Rasmusse~ (29-11-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 29-11-02 11:28

"Jimmy" <spoerg@efter.den> writes:
> Jeg skal hente alle SMS på et SIM-kort vha. et GSM-modem.
> Jeg vil derfor gerne lægge enkelte dele af de enkelte SMS i en database.
>
> Problemet er, at jeg ikke ved, om man skal bruge RegExp til at hive de
> relevante data ud?
>
> Se til sidst for et ekesempel på to SMS.
>
> Det er følgende felter i hver SMS der er interessante for mig:
>
> index #0
> SC address: '4540390999'
> Originating address: '45xxxxxxxx'
> SC timestamp: 11/24/2002 08:55:52 PM (+0100)
> User data: 'Dette er en SMS fra mig selv.'
>
> Hvad foreslår I, at jeg gør?

Hav en liste over felter du vil putte i databasen, og brug en simpel
regex til at splitte en linie op i dens to dele:

my %store_in_db = map { $_ => 1 }
("SC address", "Originating address", "SC timestamp", "User data");

while (<FILEHANDLE>) {
if (/(.*?): (.*)/) {
my ($field, $data) = ($1, $2);
if ($store_in_db{$field}) {
put_in_database($field, $data);
}
}
}

--
Lars Balker Rasmussen                  "S.M.R.T."

Jimmy (29-11-2002)
Kommentar
Fra : Jimmy


Dato : 29-11-02 23:33


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fbs48y8j6.fsf@laphroaig.balker.org...
> "Jimmy" <spoerg@efter.den> writes:
> > Jeg skal hente alle SMS på et SIM-kort vha. et GSM-modem.
> > Jeg vil derfor gerne lægge enkelte dele af de enkelte SMS i en database.
> >
> > Problemet er, at jeg ikke ved, om man skal bruge RegExp til at hive de
> > relevante data ud?
> >
> > Se til sidst for et ekesempel på to SMS.
> >
> > Det er følgende felter i hver SMS der er interessante for mig:
> >
> > index #0
> > SC address: '4540390999'
> > Originating address: '45xxxxxxxx'
> > SC timestamp: 11/24/2002 08:55:52 PM (+0100)
> > User data: 'Dette er en SMS fra mig selv.'
> >
> > Hvad foreslår I, at jeg gør?
>
> Hav en liste over felter du vil putte i databasen, og brug en simpel
> regex til at splitte en linie op i dens to dele:

hej

Tak for svaret.
Der tror jeg lige du løste halvdelen af mit problem )

Mit oprindelige problem er, at jeg får en kæmpe textfil med alle SMS i.

Jeg forestiller mig at man ligesom en database kunne løbe filen igennem og
først gribe index xx og alt mellem de to rækker ------ og så fremdeles.

Burde det ikke være relativt simpelt?
Jeg kunne forestille mig, at man splittede den og smed alle de enkelte SMS i
et array?

Mvh
Jimmy

>
> my %store_in_db = map { $_ => 1 }
> ("SC address", "Originating address", "SC timestamp", "User data");
>
> while (<FILEHANDLE>) {
> if (/(.*?): (.*)/) {
> my ($field, $data) = ($1, $2);
> if ($store_in_db{$field}) {
> put_in_database($field, $data);
> }
> }
> }
>
> --
> Lars Balker Rasmussen "S.M.R.T."



Lars Balker Rasmusse~ (30-11-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 30-11-02 01:04

"Jimmy" <spoerg@efter.den> writes:
> Mit oprindelige problem er, at jeg får en kæmpe textfil med alle SMS i.
>
> Jeg forestiller mig at man ligesom en database kunne løbe filen igennem og
> først gribe index xx og alt mellem de to rækker ------ og så fremdeles.
>
> Burde det ikke være relativt simpelt?
> Jeg kunne forestille mig, at man splittede den og smed alle de enkelte SMS i
> et array?

Det nemmeste med Perl er at tænke i linier, så hvis vi udvider mit eksempel:

my %store_in_db = map { $_ => 1 }
("SC address", "Originating address", "SC timestamp", "User data");

open SMS, "sms.txt" or die "open sms.txt: $!";

my ($index, @sms);

while (<SMS>) {
if (/^index #(\d+)/) {
$index = $1;
}
if (/(.*?): (.*)/) {
my ($field, $data) = ($1, $2);
if ($store_in_db{$field}) {
$sms[$index]->{$field} = $data;
}
}
}

Så har du et array (@sms), indekseret efter index, som indeholder
hash-referencer med sms-data, hvor man f.eks. kan tilgå "User data" i
sms #5 med: $sms[5]->{User data}
--
Lars Balker Rasmussen                  "S.M.R.T."

Jimmy (30-11-2002)
Kommentar
Fra : Jimmy


Dato : 30-11-02 13:35


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0f3cpjylcf.fsf@laphroaig.balker.org...


> Så har du et array (@sms), indekseret efter index, som indeholder
> hash-referencer med sms-data, hvor man f.eks. kan tilgå "User data" i
> sms #5 med: $sms[5]->{User data}

Nice!
Det virker jo perfekt!
Jeg er imponeret!

Jeg siger mange tak og går nu igang med at forstå hvorfor det egentligt
virker

Mvh
Jimmy



Jimmy (30-11-2002)
Kommentar
Fra : Jimmy


Dato : 30-11-02 15:06


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0f3cpjylcf.fsf@laphroaig.balker.org...
> "Jimmy" <spoerg@efter.den> writes:
> > Mit oprindelige problem er, at jeg får en kæmpe textfil med alle SMS i.
> >
> > Jeg forestiller mig at man ligesom en database kunne løbe filen igennem
og
> > først gribe index xx og alt mellem de to rækker ------ og så fremdeles.
> >
> > Burde det ikke være relativt simpelt?
> > Jeg kunne forestille mig, at man splittede den og smed alle de enkelte
SMS i
> > et array?
>
> Det nemmeste med Perl er at tænke i linier, så hvis vi udvider mit
eksempel:

Har jeg ret i, at den løber tekstfilen igennem linie for linie?

Hvis ja, er der så nogen let måde at få de forskellige felter i databasen?

Jeg vil jo helst lave en enkelt INSERT men hvis den løber igennem linie for
linie bliver det vel en INSERT + SELECT for at finde ID og UPDATE for resten
af pengene?

Man kunne vel populere nogle variabler og når de alle var populeret INSERTe,
men det er vel heller ikke nogen optimal løsning?

Er lidt forvirret

mvh
Jimmy



Lars Balker Rasmusse~ (30-11-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 30-11-02 15:26

"Jimmy" <spoerg@efter.den> writes:
> Har jeg ret i, at den løber tekstfilen igennem linie for linie?
>
> Hvis ja, er der så nogen let måde at få de forskellige felter i databasen?
>
> Jeg vil jo helst lave en enkelt INSERT men hvis den løber igennem linie for
> linie bliver det vel en INSERT + SELECT for at finde ID og UPDATE for resten
> af pengene?
>
> Man kunne vel populere nogle variabler og når de alle var populeret INSERTe,
> men det er vel heller ikke nogen optimal løsning?
>
> Er lidt forvirret

Jamen, @sms er jo populeret, så du bruger jo bare indholdet af den til
at lave en INSERT med.
--
Lars Balker Rasmussen                  "S.M.R.T."

Kim Hansen (30-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 30-11-02 01:40

"Jimmy" <spoerg@efter.den> writes:

> Jeg forestiller mig at man ligesom en database kunne løbe filen igennem og
> først gribe index xx og alt mellem de to rækker ------ og så fremdeles.
>
> Burde det ikke være relativt simpelt?
> Jeg kunne forestille mig, at man splittede den og smed alle de enkelte SMS i
> et array?

Jeg så dette trick forleden brugt til at indlæse CVS-logfiler, det kan
sikkert også bruges til dine SMS-filer.

$/ = '---------------------------------------------------------------------------';
while ( defined(my $sms = <>) ) {
...
}


--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste