/ 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
hent kun første ord/streng fra hver linie ~
Fra : Torben Jakobsen


Dato : 26-03-03 18:33

Davs...

Har et lille problem jeg håber i kan hjælpe mig med...
Skal have trykket det første ord/streng ud fra hver linie i en tekst fil
også skal det smides ind i en mysql database.
Er også nået så langt at den kan napper hele linien og gennem det i
databasen, men er som sagt kun interesse i det første ord, eller fra start
og til første blanktegn af hver linie.
Lidt hints eller et kode exempel ville bare være ok luftigvaffel... Takker


Tekst filen indeholder noget i den her stil.
%20info@dreamreality-beagles.com REJECT
%20info@oeconcept.de REJECT
-2-0--0-3-biz-b-i-z-line4932714@yahoo.com REJECT


Scriptet so far.

#!/usr/bin/perl -w
use warnings;
use strict;
use DBI;

# Set Database, Host and Port.
my $dsn = 'dbi:mysql:maildb:localhost:3306';

# Set Username and Password.
my $user = 'sql';
my $pass = 'kagehat';

my $dbh = DBI->connect($dsn, $user, $pass) or die "Can.t connect to the DB:
$DBI::errstr\n";

open(IN, "</usr/local/etc/scripts/inputfile") || die "Could not open
inputfile";
while (<IN>) { # read one line from the input file at a time
my $line = $_; # the line is input into the $_ variable
chomp;
my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare
sql
$sth->execute($_); # Execute sql stuff
}
close IN;

$dbh->disconnect;



 
 
Lars Balker Rasmusse~ (26-03-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-03-03 18:43

"Torben Jakobsen" <snuden@spanden.dk> writes:
> Skal have trykket det første ord/streng ud fra hver linie i en tekst fil
> også skal det smides ind i en mysql database.
>
> while (<IN>) { # read one line from the input file at a time
> my $line = $_; # the line is input into the $_ variable

$line =~ s/\s.*//;

> my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare
--
Lars Balker Rasmussen                  "S.M.R.T."

Torben Jakobsen (26-03-2003)
Kommentar
Fra : Torben Jakobsen


Dato : 26-03-03 19:11

er lidt slow hehe så skal lige bruge en smule mere hjælp....
Har prøvet at til føje linien.
my $line =~ s/\s.*//;
chomp;
my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare
sql
$sth->execute($_); # Execute sql stuff

men den kommer promte med en fejl...

Use of uninitialized value in substitution (s///) at addspmail line 19, <IN>
line 1.
Use of uninitialized value in substitution (s///) at addspmail line 19, <IN>
line 2.



"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fznni9g8b.fsf@laphroaig.balker.org...
> "Torben Jakobsen" <snuden@spanden.dk> writes:
> > Skal have trykket det første ord/streng ud fra hver linie i en tekst fil
> > også skal det smides ind i en mysql database.
> >
> > while (<IN>) { # read one line from the input file at a time
> > my $line = $_; # the line is input into the $_ variable
>
> $line =~ s/\s.*//;
>
> > my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)');
#Prepare
> --
> Lars Balker Rasmussen "S.M.R.T."



Lars Balker Rasmusse~ (26-03-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-03-03 19:19

"Torben Jakobsen" <snuden@spanden.dk> writes:
> er lidt slow hehe så skal lige bruge en smule mere hjælp....
> Har prøvet at til føje linien.
> my $line =~ s/\s.*//;

Det var jo heller ikke det der stod:

>> > my $line = $_; # the line is input into the $_ variable
>>
>> $line =~ s/\s.*//;

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

Torben Jakobsen (26-03-2003)
Kommentar
Fra : Torben Jakobsen


Dato : 26-03-03 19:23

Ok... så hvis jeg har forstået det rigtigt så skla det se ca sådan her
ud.... eller..?

my $line = $_; # the line is input into the $_ variable
$line =~ s/\s.*//;
chomp;
my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare
sql
$sth->execute($_); # Execute sql stuff

for det har ike den store effekt

"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fwuim9ekn.fsf@laphroaig.balker.org...
> "Torben Jakobsen" <snuden@spanden.dk> writes:
> > er lidt slow hehe så skal lige bruge en smule mere hjælp....
> > Har prøvet at til føje linien.
> > my $line =~ s/\s.*//;
>
> Det var jo heller ikke det der stod:
>
> >> > my $line = $_; # the line is input into the $_
variable
> >>
> >> $line =~ s/\s.*//;
>
> --
> Lars Balker Rasmussen "S.M.R.T."



Lars Balker Rasmusse~ (26-03-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-03-03 19:47

"Torben Jakobsen" <snuden@spanden.dk> writes:
> Ok... så hvis jeg har forstået det rigtigt så skla det se ca sådan her
> ud.... eller..?
>
> my $line = $_; # the line is input into the $_ variable
> $line =~ s/\s.*//;
> chomp;
> my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare
> sql
> $sth->execute($_); # Execute sql stuff
>
> for det har ike den store effekt

Hov, hvorfor puttede du ting i $line, uden at bruge $line?

Følgende burde være nok:

s/\s.*//;
my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare sql
$sth->execute($_); # Execute sql stuff
--
Lars Balker Rasmussen                  "S.M.R.T."

Kim Schulz (26-03-2003)
Kommentar
Fra : Kim Schulz


Dato : 26-03-03 19:49

On Wed, 26 Mar 2003 18:33:06 +0100
"Torben Jakobsen" <snuden@spanden.dk> wrote:
> Davs...
>
> Har et lille problem jeg håber i kan hjælpe mig med...
> Skal have trykket det første ord/streng ud fra hver linie i en tekst
> fil også skal det smides ind i en mysql database.
> Er også nået så langt at den kan napper hele linien og gennem det i
> databasen, men er som sagt kun interesse i det første ord, eller fra
> start og til første blanktegn af hver linie.
> Lidt hints eller et kode exempel ville bare være ok luftigvaffel...
> Takker
>
[snip]
jeg ville gøre sådanne her:

#!/usr/bin/perl -w
use warnings;
use strict;
use DBI;

# Set Database, Host and Port.
my $dsn = 'dbi:mysql:maildb:localhost:3306';

# Set Username and Password.
my $user = 'sql';
my $pass = 'kagehat';
my $value = "";
my $line ="";

my $dbh = DBI->connect($dsn, $user, $pass) or die "Can.t connect to the
DB: $DBI::errstr\n";

open(IN, "</usr/local/etc/scripts/inputfile") || die "Could not open
inputfile";
while (<IN>) { # read one line from the input file at a time
$line = $_; # the line is input into the $_ variable
    $line =~ s/\s.*//;
$value .= $line;
    $value .= ", ";

}

close IN;
chop($value); $chop($value); # fjern den sidste ", "
my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)');
$sth->execute($values);
$dbh->disconnect;



Dette skulle køre noget hurtigere, da du ikke skal lave en database
query hver gang du læser en linje.

--
Navn : Kim Schulz | The life which is unexamined is not worth
Email : kim @ schulz.dk | living. -- Plato
WWW : www.schulz.dk |

Torben Jakobsen (26-03-2003)
Kommentar
Fra : Torben Jakobsen


Dato : 26-03-03 20:16

jow den skal helst lave en database query hver gang den læser en linje, men
har fået det til at fungere....

Tak skal i have for hjælpen

"Kim Schulz" <kim@schulz.dk> wrote in message
news:20030326194856.3e516a18.kim@schulz.dk...
On Wed, 26 Mar 2003 18:33:06 +0100
"Torben Jakobsen" <snuden@spanden.dk> wrote:
> Davs...
>
> Har et lille problem jeg håber i kan hjælpe mig med...
> Skal have trykket det første ord/streng ud fra hver linie i en tekst
> fil også skal det smides ind i en mysql database.
> Er også nået så langt at den kan napper hele linien og gennem det i
> databasen, men er som sagt kun interesse i det første ord, eller fra
> start og til første blanktegn af hver linie.
> Lidt hints eller et kode exempel ville bare være ok luftigvaffel...
> Takker
>
[snip]
jeg ville gøre sådanne her:

#!/usr/bin/perl -w
use warnings;
use strict;
use DBI;

# Set Database, Host and Port.
my $dsn = 'dbi:mysql:maildb:localhost:3306';

# Set Username and Password.
my $user = 'sql';
my $pass = 'kagehat';
my $value = "";
my $line ="";

my $dbh = DBI->connect($dsn, $user, $pass) or die "Can.t connect to the
DB: $DBI::errstr\n";

open(IN, "</usr/local/etc/scripts/inputfile") || die "Could not open
inputfile";
while (<IN>) { # read one line from the input file at a time
$line = $_; # the line is input into the $_ variable
$line =~ s/\s.*//;
$value .= $line;
$value .= ", ";

}

close IN;
chop($value); $chop($value); # fjern den sidste ", "
my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)');
$sth->execute($values);
$dbh->disconnect;



Dette skulle køre noget hurtigere, da du ikke skal lave en database
query hver gang du læser en linje.

--
Navn : Kim Schulz | The life which is unexamined is not worth
Email : kim @ schulz.dk | living. -- Plato
WWW : www.schulz.dk |



Kim Schulz (26-03-2003)
Kommentar
Fra : Kim Schulz


Dato : 26-03-03 20:28

On Wed, 26 Mar 2003 20:16:12 +0100
"Torben Jakobsen" <snuden@spanden.dk> wrote:
> jow den skal helst lave en database query hver gang den læser en
> linje, men har fået det til at fungere....

det er upraktisk med mindre du direkte har et formål med det

INSERT INTO spam (address) VALUES ("foo")
INSERT INTO spam (address) VALUES ("bar")
INSERT INTO spam (address) VALUES ("foobar")

bruger næsten 3 gange så mange ressources som:

INSERT INTO spam (address) VALUES ("foo","bar","foobar")

resultatet i den sidste ende er nøjagtigt det samme.

--
Navn : Kim Schulz | Join the Navy; sail to far-off exotic lands,
Email : kim @ schulz.dk | meet exciting interesting people, and kill
WWW : www.schulz.dk | them.

Peter Brodersen (26-03-2003)
Kommentar
Fra : Peter Brodersen


Dato : 26-03-03 20:49

On Wed, 26 Mar 2003 20:27:58 +0100, Kim Schulz <kim@schulz.dk> wrote:

>INSERT INTO spam (address) VALUES ("foo","bar","foobar")
>
>resultatet i den sidste ende er nøjagtigt det samme.

Her menes der vel:

INSERT INTO spam (address) VALUES ("foo"), ("bar"), ("foobar");

--
- Peter Brodersen

Kim Schulz (26-03-2003)
Kommentar
Fra : Kim Schulz


Dato : 26-03-03 20:53

On Wed, 26 Mar 2003 20:48:39 +0100
Peter Brodersen <usenet@ter.dk> wrote:
> On Wed, 26 Mar 2003 20:27:58 +0100, Kim Schulz <kim@schulz.dk> wrote:
>
> >INSERT INTO spam (address) VALUES ("foo","bar","foobar")
> >
> >resultatet i den sidste ende er nøjagtigt det samme.
>
> Her menes der vel:
>
> INSERT INTO spam (address) VALUES ("foo"), ("bar"), ("foobar");


yeps sorry.


--
Navn : Kim Schulz | Marriage causes dating problems.
Email : kim @ schulz.dk |
WWW : www.schulz.dk |

Tore Aursand (26-03-2003)
Kommentar
Fra : Tore Aursand


Dato : 26-03-03 21:04

On Wed, 26 Mar 2003 18:33:06 +0100, Torben Jakobsen wrote:
> open(IN, "</usr/local/etc/scripts/inputfile") || die "Could not open
> inputfile";
> while (<IN>) { # read one line from the input file at a time
> my $line = $_; # the line is input into the $_ variable
> chomp;
> my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)'); #Prepare
> sql
> $sth->execute($_); # Execute sql stuff
> }
> close IN;

Det er mer effektivt å forberede (prepare) SQL-setninger utenfor løkker,
slik de slipper å bli parset på nytt inne i løkken;

my $sth = $dbh->prepare('INSERT INTO spam (address) VALUES (?)');
while my $line ( <IN> ) {
chomp( $line );
$line =~ s,\s.*,,;
$sth->execute( $line );
}
$sth->finish();


--
Tore Aursand

Thorbjoern Ravn Ande~ (26-03-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 26-03-03 23:30

"Tore Aursand" <tore@aursand.no> writes:

> Det er mer effektivt å forberede (prepare) SQL-setninger utenfor løkker,
> slik de slipper å bli parset på nytt inne i løkken;

Det afhænger en del af databasen. Under Oracle er en preparestatement
så tung, at det ikke nødvendigvis er en fordel at bruge den. Det
anbefales, som altid, at måle efter.

Er denne med "print første ord" for simpel til at være god golf?

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Tore Aursand (27-03-2003)
Kommentar
Fra : Tore Aursand


Dato : 27-03-03 04:21

On Wed, 26 Mar 2003 23:30:05 +0100, Thorbjoern Ravn Andersen wrote:
>> Det er mer effektivt å forberede (prepare) SQL-setninger utenfor
>> løkker, slik de slipper å bli parset på nytt inne i løkken;

> Det afhænger en del af databasen. Under Oracle er en preparestatement
> så tung, at det ikke nødvendigvis er en fordel at bruge den.

Hvorfor ikke?

> Er denne med "print første ord" for simpel til at være god golf?

Nja. Nei. Tja. :) Problemet med en Golf her er vel at det neppe lærer
OP noenting...?


--
Tore Aursand

Thorbjoern Ravn Ande~ (27-03-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 27-03-03 08:12

"Tore Aursand" <tore@aursand.no> writes:

> > Det afhænger en del af databasen. Under Oracle er en preparestatement
> > så tung, at det ikke nødvendigvis er en fordel at bruge den.
>
> Hvorfor ikke?

Dette er en generel betragtning. Fordi det kan være så tungt at
oprette og bruge et PreparedStatement i forhold til blot at fyre rå
SQL af, at det måske ikke kan betale sig.

Jeg kan selvfølgelig ikke finde det nu, men jeg har set et link der
analyserer på tidsforbruget, og udregner hvor mange inserts der skal
laves førend det kan betale sig rent tidsmæssigt. Det var via JDBC,
men jeg tror ikke implementeringerne er så forskellige på dét punkt.

>
> > Er denne med "print første ord" for simpel til at være god golf?
>
> Nja. Nei. Tja. :) Problemet med en Golf her er vel at det neppe lærer
> OP noenting...?

Skal Golf det?

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Tore Aursand (27-03-2003)
Kommentar
Fra : Tore Aursand


Dato : 27-03-03 09:58

On Thu, 27 Mar 2003 08:12:03 +0100, Thorbjoern Ravn Andersen wrote:
>>> Det afhænger en del af databasen. Under Oracle er en
>>> preparestatement så tung, at det ikke nødvendigvis er en fordel at
>>> bruge den.

>> Hvorfor ikke?

> Dette er en generel betragtning. Fordi det kan være så tungt at
> oprette og bruge et PreparedStatement i forhold til blot at fyre rå SQL
> af, at det måske ikke kan betale sig.

Da _tror_ jeg du tar feil. Jeg utførte for en tid tilbake en del tester
mot ulike RDMSer [1], og det var _alltid_ raskere å foreta en prepare()
utenfor løkker. Koden så _omtrent_ slik ut (meget forkortet):

#!/usr/bin/perl
#
use strict;
use warnings;

my @db_types = qw( mysql ODBC oracle );
my $db_name = "user";
my @usernames = ( ... ); # inneholdt x tilfeldige strenger

foreach my $db_type ( @db_types ) {
my $dbh = DBI->connect("DBI:$db_type:$db_name");

my $sth = $dbh->prepare('INSERT INTO user (username) VALUES (?)');
foreach my $username ( @usernames ) {
$sth->execute( $username );
}
£sth->finish();

$dbh->disconnect();
}

[1] MySQL, Microsoft SQL Server og Oracle

> Det var via JDBC, men jeg tror ikke implementeringerne er så
> forskellige på dét punkt.

Er ikke JDBC _veldig_ treg? Har ikke vært borti den selv, men mener å
ha hørt noe slikt.


--
Tore Aursand

Thorbjoern Ravn Ande~ (27-03-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 27-03-03 20:37

"Tore Aursand" <tore@aursand.no> writes:

> > Dette er en generel betragtning. Fordi det kan være så tungt at
> > oprette og bruge et PreparedStatement i forhold til blot at fyre rå SQL
> > af, at det måske ikke kan betale sig.
>
> Da _tror_ jeg du tar feil. Jeg utførte for en tid tilbake en del tester
> mot ulike RDMSer [1], og det var _alltid_ raskere å foreta en prepare()
> utenfor løkker. Koden så _omtrent_ slik ut (meget forkortet):

Jeg har ikke målt selv, men fandt følgende bogcitat "it takes about 65
iterations of a prepared statement before its total time for execution
catches up with a statement."


http://www.oreilly.com/catalog/jorajdbc/chapter/ch19.html

> > Det var via JDBC, men jeg tror ikke implementeringerne er så
> > forskellige på dét punkt.
>
> Er ikke JDBC _veldig_ treg? Har ikke vært borti den selv, men mener å
> ha hørt noe slikt.

Det skulle hjælpe en del at slå autocommit fra.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Henrik Tougaard (28-03-2003)
Kommentar
Fra : Henrik Tougaard


Dato : 28-03-03 13:58

Tore Aursand wrote:

> On Thu, 27 Mar 2003 08:12:03 +0100, Thorbjoern Ravn Andersen wrote:
>>>> Det afhænger en del af databasen.
>> Dette er en generel betragtning. Fordi det kan være så tungt at
>> oprette og bruge et PreparedStatement i forhold til blot at fyre rå SQL
>> af, at det måske ikke kan betale sig.
>
> Da _tror_ jeg du tar feil. Jeg utførte for en tid tilbake en del tester
> mot ulike RDMSer [1], og det var _alltid_ raskere å foreta en prepare()
> utenfor løkker.
....
> [1] MySQL, Microsoft SQL Server og Oracle
>
Det er da klart!
Det er jo kun spørgsmålet om prepare står indenfor løkken eller udenfor.
Hvis indenfor vil der blive lavet et kald af mindst $dbh->prepare (og evt
det bagved liggende RDBMS halløj) i hver løkke gennemløb.
Visse baser laver et ekstra arbejde hvis der er placeholders i SQL'en: de
gemmer SQLen og erstatter placeholderne (?-erne) med værdierne fra execute
kaldet.

I visse RDBMSer eller rettere DBDer [2] vil være hurtigere med kode som:
$dbh=DBI->connect....
for my $dbtype (....) {
$dbh->do("INSERT...$dbtype...");
}
$dbh->commit;
og i de nyere versioner er DBI er der støtte for en $dbh->do hele vejen ned
igennem XS laget, så det kan være det breder sig.

[2] DBD::Ingres er vist pt. den eneste.

mvh
Henrik Tougaard, DBD::Ingres

Peter Makholm (27-03-2003)
Kommentar
Fra : Peter Makholm


Dato : 27-03-03 09:22

Thorbjoern Ravn Andersen <nospam0000@unixsnedkeren.dk> writes:

> Er denne med "print første ord" for simpel til at være god golf?

#!/usr/bin/perl -p
s/ .*//
__END__

?

Det eneste i nærheden jeg lige kan komme på er:

#!/usr/bin/perl -pl
/ /;$_=$`
__END__

Men det er jo hele 3 tegn længere.

Hvis det ikke kan løses kortere end på den indlysende måde (den
første) mener jeg ikke at det er god golf. Det kan godt være simpelt
og stadigvæk golfes en smule:

På STDERR skal der skrives én linje indenholdende ordet foobar og ikke
andet. Yderligere uddata er ikke tilladt.

Men det er lidt en enten eller opgave. Enten finder man tricket eller
også gør man ikke. Jeg tror basalt set kun der var to forskellige
løsninger da vi golfede den på golf@perl.org for et år siden.

--
Peter Makholm | Yes, you can fight it, but in the end the ultimate
peter@makholm.net | goal of life is to have fun
http://hacking.dk | -- Linus Torvalds

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407938
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste