Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion Rekenbewerking op text file

Path: g2news1.google.com!news1.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: John Bokma <postmas...@castleamber.com>
Newsgroups: nl.comp.os.linux.programmeren
Subject: Re: Rekenbewerking op text file
Date: 24 Feb 2005 18:13:04 GMT
Organization: Castle Amber - software development
Lines: 142
Message-ID: <Xns96077C48F1183castleamber@130.133.1.4>
References: <slrnd1loso.emr.root@dragonhill.xs4all.nl> <newscache$hpbbci$x9d$1@news.emea.compuware.com> <slrnd1ra6j.s09.root@dragonhill.xs4all.nl>
X-Trace: individual.net Qd975rE7n91eCHcXjnqD5gnouYdtURemKeIYORhGtP12uj1qXE
User-Agent: Xnews/5.04.25
X-Face: $7h&5K*ZL9*ZQ\6Hco2"V?1dD*C<ab^>zlws[S%i0b,@gKk|[,)Y-<hk143{.Ov"x{({zo( l,N\m`-_^nJfVQdEyt+-uAP^7WG]5mHj9&::7X-qK;Yv;xmRvNWQR"_igw+cr5WMj;6:zlj<R80Ei@ $gGWq&*{FL*kC*a

Kees de Koster wrote:

 > #v+
> #!/usr/bin/perl

Erg belangrijk om hier direct neer te zetten:

use strict;
use warnings;

> if ($#ARGV != 2) {
>     print "usage: input-file output-file factor\n";
>     exit;
> }

leesbaarder:

unless ( @ARGV == 3 ) {

    	print ...
    	exit;
}

> $inputfile = $ARGV[0];
> $outputfile = $ARGV[1];
> $factor = $ARGV[2];


my ( $inputfile, $outputfile, $factor ) = @ARGV;

> open(IF, $inputfile);
   or die "Can't open '$inputfile' for reading: $!";

> open(OF, ">$outputfile");

idem.

Met een recente versie van Perl kan je ook:

open my $if, $inputfile or die...
open my $of, '>', $outputfile or die ...

doen

> my $line;

stop in de while

> my ($bl, $el);

stop in de while 

> my @numbers;
> my $volume;

ditto
> 
> while ($line = <IF>) {
>     ($bl, $el) = split /=/, $line;
>     if ($bl > 19000000000000) {
>         @numbers = split /,/, $el;
>         $volume = pop @numbers;

while ( my $line = <$if> ) {

    	my ( $bl, $el ) = split /=/, $line;
    	unless ( $bl > 19000000000000 )
    	    	
    	    	print $of $line;
    	    	next;
    	}

Dit is leesbaarder (vind ik), indien er niks te doen is, next.

          @numbers = split /,/, $el;
          $volume = pop @numbers;

Let op: $volume kan een \n bevatten, maar door
de vermenigvuldiging verderop raak je die kwijt.

>         @numbers = map {$_ * $factor} @numbers;

    	    doe ik later :-D.

>         use integer;

ai, dat is vrij ticky, sterker, ik zou het ergens weer uitzetten.

>         $volume = $volume / $factor;

    	    $volume = int( $volume / $factor );

>         print OF $bl;
>         print OF "=";
>         print OF join "", map {"$_,"} @numbers;
>         print OF $volume;
>         print OF "\n";

    	    print "$bl=",
    	    	    join ( ",", map { $_ * $factor } @numbers ),
    	    	    ",volume\n";


>     } else {
>         print OF $line;
>     }
> }
> 
> close(IF);

close $if or die "Can't close ... $!"; # [1]

> Er zullen wel wat niet zulk mooie constructies inzitten maar tis m'n
> eerste Perl progje, ga vanmiddag naar de bieb een Perl boek zoeken.

Probeer Learning Perl (O'Reilly) en Perl Cookbook (O'Reilly) te pakken 
te krijgen.


[1] recent gehad dat dit echt faalde, de buffer werd door de close weg
    geschreven, en .... er was geen ruimte meer op de HD :-D. Als je het 
    helemaal mooi wilt doen: ( print ...... ) or die ...

[2] En de Koos speciaal voor vandaag:

#!perl -spaF[=,]

next unless $F[0] > 19000000000000;
$_ = "$F[ 0 ]=" . join ',', (

    map { $_ * $factor } @F[ 1..4 ]

), int( $F[ 5 ] / $factor ) . "\n"


convert.pl -factor=4 in.txt > out.txt

-- 
John Bokma
                 Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Ervaren Perl / Java programmeur beschikbaar:  http://castleamber.com/
Tevreden opdrachtgevers:     http://castleamber.com/testimonials.html