/ 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
lidt manipulering
Fra : Lars L. Christensen


Dato : 25-04-01 19:33

How do I do this...??

Jeg har en backupfil fra en database, hvor hver kolonne er separeret af en tab (\t).

Jeg skal have flyttet lidt rundt på kolonnerne, da den gamle og den nye database ikke er designet ens.

Jeg har 5 felter, der er placeret som:

felt_a felt_c felt_b felt_d felt_e

De skulle gerne komme til at stå i rækkefølge, men hvordan gør jeg dette nemmest?
(det er nok noget med nogle regulære expressions, men jeg kan ikke lige få det til at virke)

mvh
Lars Christensen



 
 
Peter Makholm (25-04-2001)
Kommentar
Fra : Peter Makholm


Dato : 25-04-01 19:37

"Lars L. Christensen" <news@lc-data.dk> writes:

> felt_a felt_c felt_b felt_d felt_e


@fields = split /\t/, $line;
$newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3], $fields[4];


--
hash-bang-slash-bin-slash-bash

Lars L. Christensen (25-04-2001)
Kommentar
Fra : Lars L. Christensen


Dato : 25-04-01 20:20

"Peter Makholm" <peter@makholm.net> skrev i en meddelelse news:874rvcu8r3.fsf@xyzzy.adsl.dk...
> "Lars L. Christensen" <news@lc-data.dk> writes:
>
> > felt_a felt_c felt_b felt_d felt_e
>
>
> @fields = split /\t/, $line;
> $newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3], $fields[4];

Du kan vel ikke tilfældigvis den samme kommando, så jeg lan lave den direkte fra kommandolinien?

Jeg skulle formatrere det ene felt, som indeholder en dato, og det blev lavet med:

perl -pe 's#(\d{2})/(\d{2})/(\d{4})#\3/\2/\1#g' < fil.input > fil.output

Sådan noget i den stil...

mvh
Lars




Peter Makholm (25-04-2001)
Kommentar
Fra : Peter Makholm


Dato : 25-04-01 20:59

"Lars L. Christensen" <news@lc-data.dk> writes:

> > @fields = split /\t/, $line;
> > $newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3], $fields[4];
>
> Du kan vel ikke tilfældigvis den samme kommando, så jeg lan lave den direkte fra kommandolinien?

Joda:

perl -pi.bak -e '@f = split /\t/; $_ = join "\t", $f[0], $f[2], $f[1], $f[3], $f[4];' <filnavn>

Kan du se ligheden?

--
hash-bang-slash-bin-slash-bash

Trond Michelsen (26-04-2001)
Kommentar
Fra : Trond Michelsen


Dato : 26-04-01 21:22


Peter Makholm <peter@makholm.net> skrev i
meldingsnyheter:87u23csqcg.fsf@xyzzy.adsl.dk...
> "Lars L. Christensen" <news@lc-data.dk> writes:
>
> > > @fields = split /\t/, $line;
> > > $newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3],
$fields[4];
> >
> > Du kan vel ikke tilfældigvis den samme kommando, så jeg lan lave den
direkte fra kommandolinien?
>
> Joda:
>
> perl -pi.bak -e '@f = split /\t/; $_ = join "\t", $f[0], $f[2], $f[1],
$f[3], $f[4];' <filnavn>

og... siden Perl er så godt som spesiallaget for onelinere, så finnes det
selvfølgelig switches for å gjøre dette enklere..

-a = autosplit. Splitter til @F.
-F = tegnet det skal splittes på.

I tillegg synes ihvertfall jeg at en slice er lettere å lese enn å liste opp
en rekke arrayelementer

perl -F/\\t/ -api.bak -e '$_ = join "\t", @F[0,2,1,3,4]' <filnavn>

Men, siden det ikke chompes, så vil dette bare virke dersom siste element
fortsatt brukes som det siste.

Hvis element 3 og 4 bytter plass, så må man gjøre noe slikt:

perl -l -F/\\t/ -api.bak -e 'chomp $F[-1];$_ = join "\t", @F[0,2,1,4,3]'
<filnavn>

eller slik (uten -a):

perl -l -pi.bak -e 'chomp;$_ = join "\t", (split /\t/)[0,2,1,4,3]' <filnavn>

--
Trond Michelsen





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

Månedens bedste
Årets bedste
Sidste års bedste