/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Søg og erstat imellem 2 tekstfiler
Fra : Morten Christensen


Dato : 13-04-03 13:32

På en SuSE 8.1 har jeg 2 tekstfiler.

Fil 1 er en statisk fil med ca. 4.000 linier fra en kunde-database. Den
indeholder:

felt 1-8 kundenummer
felt 10 til 30 kundens navn


Fil 2 bliver dannet i et administrationssystem dagligt. Der er 500-1.000
linier hver dag. Den indeholder

Felt 1 til 15 diverse
Felt 16 til 23 kundenummer
Felt 24 til 43 mellemrum
Felt 44 til 80 diverse oplysninger


Det er ikke alle kundenumre fra fil 2, som også findes i fil 1, men i de
tilfælde, hvor nummeret fildes i fil 1 vil vi gerne automatisk hver dag
have sat kundens navn ind i fil 2.


Det burde kunne gøres ved at læse fil1 med cat eller grep, pipe den til
sed og med sed lave en søg og erstat i fil 2. Jeg har forsøgt at læse om
sed, men det er ikke lykkedes at få hjerne til at fungere ligesom sed's
manual-forfattere.

Kan en af jer ryste strukturen til en løsning ud af ærmet ?



--
mvh
Morten Christensen







 
 
Peter Makholm (13-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 13-04-03 13:50

Morten Christensen <mc@mc.sletmig.cx> writes:

> felt 1-8 kundenummer
> felt 10 til 30 kundens navn

Når du nu siger felt, så mener du tegn, ikke?

> Det burde kunne gøres ved at læse fil1 med cat eller grep, pipe den
> til sed og med sed lave en søg og erstat i fil 2.

Lige så snart at du har to filer, så bliver det let lidt svært at gøre
med værktøjer der primært er beregnet til at arbejde på strømme eller
enkeltfiler.

Man kunne selvfølgelig lave noget sjusk baseret på at generere noget
kode ud fra fil1 som man så pipede gennem bash. Jeg tror nok jeg ville
bruge perl til opgave. Noget ala følgende:

#!/usr/bin/perl

$fil1 = "...";
$fil2 = "...";

my %kunder;

open FH, '<', $fil1 or die;
while(<FH>) {
my $nummer = substr $_, 0, 7;
my $navn = substr $_, 9, 20;
$kunde{$nummer} = $navn;
}
close FH;

open IN, '<', $fil2 or die;
open OUT, '>', $fil2."tmp" or die;
while(<IN>) {
my $nummer = substr $_, 15, 7;
my $navn = $kunder{$nummer};
if (defined $navn) {
print OUT [... linjen med $navn indsat på passende vis ...]
} else {
print OUT $_; # linjen uden ændringer
}
}
close IN;
close OUT;

rename $fil2."tmp", $fil2;

--
Peter Makholm | Have you ever felt trapped inside a Klein bottle?
peter@makholm.net |
http://hacking.dk |

Morten Christensen (13-04-2003)
Kommentar
Fra : Morten Christensen


Dato : 13-04-03 16:19

Peter Makholm wrote in mail, at 13-04-03 14:50:


> Morten Christensen <mc@mc.sletmig.cx> writes:
>
>
>>felt 1-8 kundenummer
>>felt 10 til 30 kundens navn
>
>
> Når du nu siger felt, så mener du tegn, ikke?

Ja selvfølgelig.

> Jeg tror nok jeg ville
> bruge perl til opgave. Noget ala følgende:
>
> #!/usr/bin/perl
>
> $fil1 = "...";
> $fil2 = "...";
>
> my %kunder;
>
> open FH, '<', $fil1 or die;
> while(<FH>) {
> my $nummer = substr $_, 0, 7;
> my $navn = substr $_, 9, 20;
> $kunde{$nummer} = $navn;
> }
> close FH;
>
> open IN, '<', $fil2 or die;
> open OUT, '>', $fil2."tmp" or die;
> while(<IN>) {
> my $nummer = substr $_, 15, 7;
> my $navn = $kunder{$nummer};
my $navn = $kunde{$nummer};
> if (defined $navn) {
> print OUT [... linjen med $navn indsat på passende vis ...]
> } else {
> print OUT $_; # linjen uden ændringer
> }
> }
> close IN;
> close OUT;
>
> rename $fil2."tmp", $fil2;

Tak for input'et. Jeg har fået perl-scriptet til at køre, men jeg er for
uvidende til at lave syntaksen i linien
print OUT [... linjen med $navn indsat på passende vis ...]

Jeg vil bruge tegn 0-8 fra fil2, derefter værdien i $navn og så tegn 44
til 80 i fil2. Kan jeg få lidt hjælp til den syntaks.


--
mvh og tak for indsatsen
Morten Christensen


Peter Makholm (13-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 13-04-03 17:57

Morten Christensen <mc@mc.sletmig.cx> writes:

> Jeg vil bruge tegn 0-8 fra fil2, derefter værdien i $navn og så tegn
> 44 til 80 i fil2. Kan jeg få lidt hjælp til den syntaks.

Som gjort resten af stederne (med forbehold for off-by-one eller
deromkring) kan funktionen substr bruges til at pille de rette tegn
ud. Den tager en streng, et offset og en længde. Altså noget ala:

my $felt1 = substr $_, 0, 8;
my $felt2 = substr $_, 44, 36;
print OUT $felt1, $navn, $felt2, "\n";

--
Peter Makholm | We constantly have to keep in mind why natural
peter@makholm.net | languages are good at what they're good at. And to
http://hacking.dk | never forget that Perl is a human language first,
| and a computer language second

Morten Christensen (13-04-2003)
Kommentar
Fra : Morten Christensen


Dato : 13-04-03 22:30

Peter Makholm wrote in mail, at 13-04-03 18:57:


> Morten Christensen <mc@mc.sletmig.cx> writes:
>
>
>>Jeg vil bruge tegn 0-8 fra fil2, derefter værdien i $navn og så tegn
>>44 til 80 i fil2. Kan jeg få lidt hjælp til den syntaks.
>
>
> Som gjort resten af stederne (med forbehold for off-by-one eller
> deromkring) kan funktionen substr bruges til at pille de rette tegn
> ud. Den tager en streng, et offset og en længde. Altså noget ala:
>
> my $felt1 = substr $_, 0, 8;
> my $felt2 = substr $_, 44, 36;
> print OUT $felt1, $navn, $felt2, "\n";


Tak for hjælpen. Jeg har fået noget rigtig fornuftigt ud af det.

Det værste problem var, at hvis $navn er for kort, så kommer der et
linieskifte i den endelige fil. Det har jeg forsøgt at komme ud af, ved
at forlænge nogen af navnene kunstigt.

Der er 1.300 linier i den daglige fil og 4.400 i "databasen" med
navnene. Det tar' under 1 sekund at flette navnene ind i den daglige fil
på en PII 350).


--
mvh
Morten Christensen


Lars Kongshøj (13-04-2003)
Kommentar
Fra : Lars Kongshøj


Dato : 13-04-03 14:02

Morten Christensen wrote:
> Fil 1 er en statisk fil med ca. 4.000 linier fra en kunde-database. Den
> indeholder:
....
> Fil 2 bliver dannet i et administrationssystem dagligt. Der er 500-1.000
> linier hver dag. Den indeholder
....
> Det er ikke alle kundenumre fra fil 2, som også findes i fil 1, men i de
> tilfælde, hvor nummeret fildes i fil 1 vil vi gerne automatisk hver dag
> have sat kundens navn ind i fil 2.

Jeg vil foreslå dig at læse filerne ind i en SQL-database. De er
beregnet til at løse den slags problemer.

--
Lars Kongshøj
http://www.kongshoj.com/

Peter Makholm (13-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 13-04-03 14:08

Lars Kongshøj <lars_kongshoj@hotmail.com> writes:

> Jeg vil foreslå dig at læse filerne ind i en SQL-database. De er
> beregnet til at løse den slags problemer.

Men også totalt overkill for den ønskede transformation. Hvis man kan
lægge hele processen ind i nogle databaser så man helt undgår at sidde
med de to filer kan det måske svare sig, men alene at gøre det for at
løse dette problem er det næppe særlig produktivt.

--
Peter Makholm | Ladies and gentlemen, take my advice, pull down your
peter@makholm.net | pants and slide on the ice
http://hacking.dk | -- Sidney Freedman

Lars Kongshøj (13-04-2003)
Kommentar
Fra : Lars Kongshøj


Dato : 13-04-03 15:51

Peter Makholm wrote:
> Lars Kongshøj <lars_kongshoj@hotmail.com> writes:
> > Jeg vil foreslå dig at læse filerne ind i en SQL-database. De er
> > beregnet til at løse den slags problemer.
> Men også totalt overkill for den ønskede transformation. Hvis man kan
> lægge hele processen ind i nogle databaser så man helt undgår at sidde
> med de to filer kan det måske svare sig, men alene at gøre det for at
> løse dette problem er det næppe særlig produktivt.

Det er da overkill at sætte sig og skrive et kompliceret program, der
kører o(n*m), i et programmeringssprog, der ikke er beregnet til det, i
stedet for at skrive en simpel one-liner i et programmeringssprog, der
er beregnet til det, og som kan løse opgaven effektivt.

--
Lars Kongshøj
http://www.kongshoj.com/

Peter Makholm (13-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 13-04-03 16:25

Lars Kongshøj <lars_kongshoj@hotmail.com> writes:

> Det er da overkill at sætte sig og skrive et kompliceret program, der
> kører o(n*m), i et programmeringssprog, der ikke er beregnet til det, i

For det første køre det viste program i O(n+m), hvilket er det
optimale for den givne opgave (Alle data skal læses ind). For det
andet så er perl lavet til den slags opgaver. For det tredje er det
næppe mere kompliceret end at skulle til at fedte med at sætte
database op og lave passende tabeller.


I øvrigt er O-notation kun halvdelen af historien om hvor effektiv en
løsning er. Jeg skrev engang en primtalssi der kørte i liniær-tid. Jeg
tror at den skulle køre et par dage før den overhalede en primitiv
implementering af Erathostenes primtalssi. Den så ganske god ud på
papiret men konstanterne var voldsomt store.

--
Peter Makholm | Perhaps that late-night surfing is not such a
peter@makholm.net | waste of time after all: it is just the web
http://hacking.dk | dreaming
| -- Tim Berners-Lee

Benny Amorsen (13-04-2003)
Kommentar
Fra : Benny Amorsen


Dato : 13-04-03 20:48

>>>>> "PM" == Peter Makholm <peter@makholm.net> writes:

PM> I øvrigt er O-notation kun halvdelen af historien om hvor effektiv
PM> en løsning er. Jeg skrev engang en primtalssi der kørte i
PM> liniær-tid. Jeg tror at den skulle køre et par dage før den
PM> overhalede en primitiv implementering af Erathostenes primtalssi.
PM> Den så ganske god ud på papiret men konstanterne var voldsomt
PM> store.

Dvs. du kan på lineær tid i N give mig primtallene mellem 2 og N? Det
vil jeg godt se.


Venlig hilsen

Benny Amorsen

Adam Sjøgren (13-04-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 13-04-03 17:07

On Sun, 13 Apr 2003 17:25:23 +0200, Peter Makholm wrote:

> Lars Kongshøj <lars_kongshoj@hotmail.com> writes:
>> Det er da overkill at sætte sig og skrive et kompliceret program, der
>> kører o(n*m), i et programmeringssprog, der ikke er beregnet til det, i

> For det første køre det viste program i O(n+m), hvilket er det
> optimale for den givne opgave (Alle data skal læses ind). For det
> andet så er perl lavet til den slags opgaver. For det tredje er det
> næppe mere kompliceret end at skulle til at fedte med at sætte
> database op og lave passende tabeller.

"To a database person, every nail looks like a thumb. Or something
like that."


,

--
"Vilken sanning, Måns, är sann?" Adam Sjøgren
asjo@koldfront.dk

Lars Kongshøj (13-04-2003)
Kommentar
Fra : Lars Kongshøj


Dato : 13-04-03 17:35

Peter Makholm wrote:
> For det første køre det viste program i O(n+m), hvilket er det
> optimale for den givne opgave (Alle data skal læses ind).

Nedenstående er skrevet med det forbehold, at mit perl-kendskab er meget
begrænset.

Jeg antager, at du mener, at dette kan køre i konstant tid:

my $navn = $kunder{$nummer};

Det er vel ikke implementeret som et C-array, så man kan ikke bare slå
op ved at beregne et lageradresse på grundlag af $nummer?

Hvis det er implementeret som et C-array, så virker det i hvert fald
kun, hvis kundenumrene er numeriske og ikke for høje i forhold til
maskinen RAM-mængde.

--
Lars Kongshøj
http://www.kongshoj.com/

Peter Makholm (13-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 13-04-03 17:47

Lars Kongshøj <lars_kongshoj@hotmail.com> writes:

> Det er vel ikke implementeret som et C-array, så man kan ikke bare slå
> op ved at beregne et lageradresse på grundlag af $nummer?

Nej, det er implementeret ved noget 'smart' hashing, som i dette
tilfælde vil køre i nær konstant tid.

--
Peter Makholm | We constantly have to keep in mind why natural
peter@makholm.net | languages are good at what they're good at. And to
http://hacking.dk | never forget that Perl is a human language first,
| and a computer language second

Peter Makholm (14-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 14-04-03 07:49

Benny Amorsen <benny+nospam@amorsen.dk> writes:

> Dvs. du kan på lineær tid i N give mig primtallene mellem 2 og N? Det
> vil jeg godt se.

Søger man på google efter 'linear time prime sieve' finder man blandt
andet et link til en artikel i LNCS1423:

<http://link.springer-ny.com/link/service/series/0558/bibs/1423/14230179.htm>

Den beskriver både en O(n)- og en O(n/log log n)-tids primtalssi. Jeg
gider ikke lige læse artiklen for at se om der et tale om samme
algoritme, jeg implementerede min primtalssi ud fra en survey-artikel
der nævnte en række forskellige algoritmer med forskellig køretid og
pladsforbrug.

--
Peter Makholm | Why does the entertainment industry wants us to
peter@makholm.net | believe that a society base on full surveillance
http://hacking.dk | is bad?
| Do they have something to hide?

Søg
Reklame
Statistik
Spørgsmål : 177551
Tips : 31968
Nyheder : 719565
Indlæg : 6408843
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste