A-Z in ein Array ?

A-Z in ein Array ?

am 19.02.2006 12:53:35 von Marek Stepanek

Hallo an alle,


ich bin Perl Anfänger und habe eine naive Frage wie mir scheint. Obwohl die
Einfachheit eines Problems für einen Anfänger nicht unbedingt einsehbar ist
....

Für eine Excel-Datei möchte ich folgendes Output produzieren, um es per Copy
and Paste in die entsprechenden Zellen einzutragen:

=SUMME(A4+A8+A12+A16+A20+A24+A28+A32+A36+A40+A44+A48+A52+A56 +A60)
=SUMME(B4+B8+B12+B16+B20+B24+B28+B32+B36+B40+B44+B48+B52+B56 +B60)
=SUMME(C4+C8+C12+C16+C20+C24+C28+C32+C36+C40+C44+C48+C52+C56 +C60)
....

Im Moment habe ich folgendes Script gemacht, das aber nur eine Zeile
produziert:

#!/usr/bin/perl

use strict;

#my $i = 0 ;

my $increment;

print "=SUMME(";

for (my $i = 4; $i <= 60; $i+=4) {

$increment .= "A$i+";

}

$increment =~ s/\+$//;

print "$increment)\n";


Jetzt möchte ich die Zeilen iterieren (?) lassen von A-G zB

Wie bekomme ich [A-G] in ein @array ? Ich meine elegant, nicht etwa

@array = (A, B, C, D, E, F, G)


Danke für die Geduld



marek


--
____________________________________________________________ __________
___PODIUM_INTERNATIONAL_//_the_embassy_for_talented_young_mu sicians___
______ Marek_Stepanek mstep_[at]_PodiumInternational_[dot]_org ______
_________________ http://www.PodiumInternational.org _________________
____________________________________________________________ __________

Re: A-Z in ein Array ?

am 19.02.2006 13:01:12 von Thomas Wittek

> Jetzt möchte ich die Zeilen iterieren (?) lassen von A-G zB
>=20
> Wie bekomme ich [A-G] in ein @array ? Ich meine elegant, nicht etwa
>=20
> @array =3D (A, B, C, D, E, F, G)

@array =3D 'A' .. 'G';

-Thomas

Re: A-Z in ein Array ?

am 19.02.2006 13:41:04 von Marek Stepanek

On 19.02.2006 13:01, in article dt9mml$dt8$1@newsreader3.netcologne.de,
"Thomas Wittek" wrote:

>> Jetzt möchte ich die Zeilen iterieren (?) lassen von A-G zB
>>
>> Wie bekomme ich [A-G] in ein @array ? Ich meine elegant, nicht etwa
>>
>> @array = (A, B, C, D, E, F, G)
>
> @array = 'A' .. 'G';
>
> -Thomas

oh das ging schnell! selbst am Sonntag :-)

das Skript läuft jetzt. Falls noch etwas zu korrigieren ist, hier die letzte
Fassung:

#!/usr/bin/perl

use strict;

#my $i = 0 ;

my ($increment, @elements);

@elements = 'A' .. 'G';

foreach my $e (@elements) {

print "=SUMME(";

for (my $i = 4; $i <= 60; $i+=4) {

$increment .= "$e$i+";

}

$increment =~ s/\+$//;

print "$increment)\n\n";

$increment = '';

}

Re: A-Z in ein Array ?

am 20.02.2006 18:05:26 von Matthias Peick

Marek Stepanek skribis:

> Für eine Excel-Datei möchte ich folgendes Output produzieren, um es per Copy
> and Paste in die entsprechenden Zellen einzutragen:
>
> =SUMME(A4+A8+A12+A16+A20+A24+A28+A32+A36+A40+A44+A48+A52+A56 +A60)
> =SUMME(B4+B8+B12+B16+B20+B24+B28+B32+B36+B40+B44+B48+B52+B56 +B60)
> =SUMME(C4+C8+C12+C16+C20+C24+C28+C32+C36+C40+C44+C48+C52+C56 +C60)

Das ist etwas umständlich. Klicke einfach das Summenzeichen an, markiere bei
gedrückter Strg-Taste die einzelnen Felder und drücke die Eingabetaste.
Danach kopierst du das Feld in alle anderen Felder.

Re: A-Z in ein Array ?

am 20.02.2006 20:08:20 von Peter Ehrenberg

Matthias Peick writes:

> Marek Stepanek skribis:
>
> [...] Das ist etwas umständlich. Klicke einfach das Summenzeichen
> an, markiere bei gedrückter Strg-Taste die einzelnen Felder und
> drücke die Eingabetaste. Danach kopierst du das Feld in alle anderen
> Felder.

Nee, das was du vorschlägst ist umständlich. Wenn schon, dann schreibe
dir ein Perl-Programm, welches dir die fertige Excel-Tabelle erzeugt.

Peter

--
Dipl.-Ing. Peter Ehrenberg Tel.: +49 40 756604-40
Auf der Höhe 29 Netz: http://dipe.de/
21109 Hamburg Perl · Oracle · Linux · Netzwerk
Germany Softwareentwicklung · Installation · Administration

Excel-Datei aus Perl-Skript

am 22.03.2006 20:25:51 von Marek Stepanek

On 20.02.2006 20:08, in article m3slqdvoez.fsf@knopf.ehrenb, "Peter
Ehrenberg" wrote:

>
> Nee, das was du vorschlägst ist umständlich. Wenn schon, dann schreibe
> dir ein Perl-Programm, welches dir die fertige Excel-Tabelle erzeugt.
>
> Peter


Das war aus dem Thread " A-Z in ein Array ? " Angeregt durch diese Bemerkung
habe ich mich dran gemacht, das zu realisieren. Als Anfänger eine schwierige
Aufgabe ...

Was ich brauche ist folgendes:

# excel_autorech_in.txt:

10495 3706,1 204 6 5535.6
10636.1 3812 206 6 5676
10738.5 3993 210 6 5992,3
10838.5 4310,2 218 7 6233,7


das Ergebnis soll erstmal so aussehen, weiteres ist in Planung (dh einige
Fragen kommen da auf Euch zu ;-)

# excel_autorech_out.txt





14.03.2006 10495.00 3706.10 204 6 5535.60
15.03.2006 10636.10 3812.00 206 6 5676.00
TOTAL =SUMME(B6-B5) =SUMME(C6-C5) =SUMME(D6-D5) =SUMME(E6-E5)
=SUMME(F6-F5)


15.03.2006 10636.10 3812.00 206 6 5676.00
16.03.2006 10738.50 3993.00 210 6 5992.30
TOTAL =SUMME(B11-B10) =SUMME(C11-C10) =SUMME(D11-D10)
=SUMME(E11-E10) =SUMME(F11-F10)


16.03.2006 10738.50 3993.00 210 6 5992.30
17.03.2006 10838.50 4310.20 218 7 6233.70
TOTAL =SUMME(B16-B15) =SUMME(C16-C15) =SUMME(D16-D15)
=SUMME(E16-E15) =SUMME(F16-F15)


Hier mein Skript, was mich einige Tage gekostet hat. Meine Fragen sind als
Kommentar eingefügt. Danke für die Geduld und Hilfe


marek

# excel_autorech.pl


#!/usr/bin/perl

use strict;


my ($increment, $in_datei, $out_datei, $start_day, $month, $year, $total_km,
$bes_km, $touren, $zuschlag, $gesamt, $line, $out_line, $old_line);

my (@elements, @lines, @out_lines);

# Dateien zum Einlesen und zum Beschreiben

$in_datei = "excel_autorech_in.txt";
open DATA, $in_datei or die "Error! $!\n;";

$out_datei = "excel_autorech_out.txt";
open OUT, ">$out_datei" or die "Error! $!\n;";

$start_day = "14";
$month = "03";
$year = "2006";

# Die Daten so zu iterieren ist nicht sehr elegant. Mir wäre es lieber
# mit einem Modul 14.03.2006 - 15.03.2006 ... zu produzieren, falls ein
# Monat überschritten wird ...

while () {

chomp;
push @lines, $_ if (/^[\d,.\t\s]+$/);

}

my $day = $start_day;

foreach $line (@lines) {
$line =~ s/,/./g;
($total_km, $bes_km, $touren, $zuschlag, $gesamt) = $line =~
/([\d.]+)\t([\d.]+)\t([\d.]+)\t([\d.]+)\t([\d.]+)/;
$total_km = sprintf ("%.2f",$total_km);
$bes_km = sprintf ("%.2f",$bes_km);
$gesamt = sprintf ("%.2f",$gesamt);
push @out_lines,
"${day}.${month}.${year}\t$total_km\t$bes_km\t$touren\t$zusc hlag\t$gesamt";

$day++;

}

# hier kommt etwas ganz schrecklich kompliziertes, jedenfalls in meinen
# Augen. Ich habe es nur geschafft die Zeile 7 :
# TOTAL =SUMME(B6-B5) =SUMME(C6-C5) =SUMME(D6-D5) =SUMME(E6-E5)
# =SUMME(F6-F5)
# zu produzieren, aber nicht die Zeile 12 :
# TOTAL =SUMME(B11-B10) =SUMME(C11-C10) =SUMME(D11-D10)
# =SUMME(E11-E10) =SUMME(F11-F10)

@elements = 'B' .. 'F';


foreach $out_line (@out_lines) {

print OUT "\n\n$old_line\n" if ($old_line);
print OUT "$out_line\n" if ($old_line);

print OUT "TOTAL\t" if ($old_line);

foreach my $e (@elements) {

print OUT "=SUMME(" if ($old_line);

for (my $i = 6; $i >=5; $i-=1) {
# ich nehme an das muss mit noch einer Variablen gemacht werden:
# anstatt 6 ein $e das etwa die Zeilennummern speichert, Zeilenumbruch
# mitgezählt. Und 5 wäre dann $e-1 ... Oder ein ganz anderer Ansatz ?

$increment .= "$e$i-";

}

$increment =~ s/\-$//;

# soll das letzte "-" Minuszeichen wieder wegnehmen. Nicht sehr elegant.
# Übrigens wird auch ein überflüssiges \t eingefügt.

print OUT "$increment)\t" if ($old_line);

$increment = '';

}

$old_line = $out_line;
print OUT "\n";
}

print OUT"\n\n";


close OUT;
close DATA;

Re: Excel-Datei aus Perl-Skript

am 23.03.2006 09:04:16 von Christian Kirsch

Marek Stepanek schrieb:
> On 20.02.2006 20:08, in article m3slqdvoez.fsf@knopf.ehrenb, "Peter
> Ehrenberg" wrote:
>
>> Nee, das was du vorschlägst ist umständlich. Wenn schon, dann schreibe
>> dir ein Perl-Programm, welches dir die fertige Excel-Tabelle erzeugt.
>>
>> Peter
>
>
> Das war aus dem Thread " A-Z in ein Array ? " Angeregt durch diese Bemerkung
> habe ich mich dran gemacht, das zu realisieren. Als Anfänger eine schwierige
> Aufgabe ...
>
> Was ich brauche ist folgendes:
>
> # excel_autorech_in.txt:
>
> 10495 3706,1 204 6 5535.6
> 10636.1 3812 206 6 5676
> 10738.5 3993 210 6 5992,3
> 10838.5 4310,2 218 7 6233,7
>
>
> das Ergebnis soll erstmal so aussehen, weiteres ist in Planung (dh einige
> Fragen kommen da auf Euch zu ;-)
>
> # excel_autorech_out.txt
>
>
>
>

Es gibt ein Modul für das Erzeugen von Excel-Spreadsheets. Warum
benutzt Du das nicht?

Re: Excel-Datei aus Perl-Skript

am 23.03.2006 11:59:47 von Peter Ehrenberg

Marek Stepanek writes:

> On 20.02.2006 20:08, in article m3slqdvoez.fsf@knopf.ehrenb, "Peter
> Ehrenberg" wrote:

>> Nee, das was du vorschlägst ist umständlich. Wenn schon, dann schreibe
>> dir ein Perl-Programm, welches dir die fertige Excel-Tabelle erzeugt.

Allerdings war das eher frotzelnt zur Aussage des Vorposters gemeint,
der das alles umständlich fand und dir vorschlug, das mittels diverser
Mausklicks in Excel zu "lösen".

> [...] Was ich brauche ist folgendes:

Ich erinnere mich nicht mehr, ob du uns verraten hast, was du
eigentlich vor hast. Das ganze sieht mir sehr nach Fahrtenbuch aus.
Ich frage mich natürlich, wozu du da Excel brauchst. Rechnen kann Perl
ja auch ;-)

So ganz klar ist mir noch nicht geworden, was dein Programm tun soll.
Vielleicht kannst du das nochmal in wenigen Worten erklären.

> [...] Meine Fragen sind als Kommentar eingefügt. Danke für die
> Geduld und Hilfe

Gerne!

> [...]
> my ($increment, $in_datei, $out_datei, $start_day, $month, $year, $total_km,
> $bes_km, $touren, $zuschlag, $gesamt, $line, $out_line, $old_line);

Das ist Geschmackssache, aber _ich_ vereinbare meine Variablen
meistens erst dort, wo ich sie brauche (wir programmieren hier ja
nicht Pascal ;-). Ich finde das übersichtlicher. Oft muss man sich
dann auch nicht so lange Namen ausdenken, weil der Kontext, in dem die
Variable verwendet wird, nur wenige Zeilen umfasst.

> [...]
> # Die Daten so zu iterieren ist nicht sehr elegant. Mir wäre es lieber
> # mit einem Modul 14.03.2006 - 15.03.2006 ... zu produzieren, falls ein
> # Monat überschritten wird ...

Um mit Datumsangaben zu rechnen, kann man sie in Epoch-Format
umrechnen (Sekunden seit 1.11970, 0 Uhr). Beispiel:

use Time::Local;
use POSIX 'strftime';

my $day = "14";
my $month = "03";
my $year = "2006";

#
# Zeitpunkt in Epoch-Format umrechen
#
my $time = timelocal(0, 0, 0, $day, $month - 1, $year - 1900);

#
# Datumsdaten der nächsten 30 Tage ausgeben.
#
foreach (1..30) {
#
# Epoch in Zeitemelente zurückwandeln und Lesbar formatieren
#
print strftime('%d.%m.%Y', localtime($time)), "\n";
$time += 86400 # 60 Sec. * 60 Min. * 24 Std.
}


> [...]
> ($total_km, $bes_km, $touren, $zuschlag, $gesamt) = $line =~
> /([\d.]+)\t([\d.]+)\t([\d.]+)\t([\d.]+)\t([\d.]+)/;

Es könnte einfacher sein, die Zeile mit

($total_km, $bes_km, $touren, $zuschlag, $gesamt) = split(/\t/, $line);

zu zerlegen.

> $total_km = sprintf ("%.2f",$total_km);
> $bes_km = sprintf ("%.2f",$bes_km);
> $gesamt = sprintf ("%.2f",$gesamt);
> push @out_lines, "${day}.${month}.${year}\t$total_km\t$bes_km\t$touren\t$zusc hlag\t$gesamt";

Ich würde die komplette Zeile mit einem einzigen sprintf machen:

my $datum = strftime( ...) # s.O.
my $zeile = sprintf('%s\t%.2f\t%.2f\t%.2f', $datum, $total_km, $bes_km, $gesamt);
push @out_lines, $zeile;

> [...]
> # hier kommt etwas ganz schrecklich kompliziertes, jedenfalls in
> # meinen Augen. Ich habe es nur geschafft die Zeile 7 [...] zu
> # produzieren, aber nicht die Zeile 12 [...]

Wie gesagt, ich verstehe nicht genau, was du vor hast.

> [...]
> # soll das letzte "-" Minuszeichen wieder wegnehmen. Nicht sehr elegant.
> # Übrigens wird auch ein überflüssiges \t eingefügt.

Das liegt daran, dass du in der Schleife concatinierst. Versuche das
mal so zu schreiben, dass du statt dessen ein (oder zwei) Array(s)
benutzt und hinterher deren Elemente mit join zusammenfügst. Ungefähr
so:

push @sum, join('-', @inc);

Und später

... = join("\t", @sum);

Dann hast du keine überflüssigen - und Tabs.

>[...]

Peter

--
Dipl.-Ing. Peter Ehrenberg Tel.: +49 40 756604-40
Auf der Höhe 29 Netz: http://dipe.de/
21109 Hamburg Perl · Oracle · Linux · Netzwerk
Germany Softwareentwicklung · Installation · Administration

Re: Excel-Datei aus Perl-Skript

am 24.03.2006 00:56:58 von Marek Stepanek

On 23.03.2006 11:59, in article m3wtelbf4s.fsf@knopf.ehrenb, "Peter
Ehrenberg" wrote:

....


Wow! das muss ich erstmal verarbeiten! Jetzt ist es schon spät, kann erst
morgen Abend antworten. Aber ich denke, dass meine Fragen soweit beantwortet
sind.

Christian: welches Modul erzeugt Excel-Dateien? Vielleicht
Spreadsheet::WriteExcel ? Auf cpan.org sind so viele Module unter dem
Stichwort "Excel" aufgelistet, zu viele für einen Anfänger.


Danke für die Hilfe!


marek

Re: Excel-Datei aus Perl-Skript

am 24.03.2006 04:05:09 von Achim Grolms

Marek Stepanek wrote:

> Christian: welches Modul erzeugt Excel-Dateien? Vielleicht
> Spreadsheet::WriteExcel ?

Das benutze ich seit Jahren und bin damit
gut zufrieden.

Re: Excel-Datei aus Perl-Skript

am 24.03.2006 17:46:19 von Christian Kirsch

Marek Stepanek schrieb:
> On 23.03.2006 11:59, in article m3wtelbf4s.fsf@knopf.ehrenb, "Peter
> Ehrenberg" wrote:
>
> ...
>
>
> Wow! das muss ich erstmal verarbeiten! Jetzt ist es schon spät, kann erst
> morgen Abend antworten. Aber ich denke, dass meine Fragen soweit beantwortet
> sind.
>
> Christian: welches Modul erzeugt Excel-Dateien? Vielleicht
> Spreadsheet::WriteExcel ? Auf cpan.org sind so viele Module unter dem
> Stichwort "Excel" aufgelistet, zu viele für einen Anfänger.
>

Was hindert den Anfänger daran, einen Blick in die Dokumentation zu
werfen? Oder Google zu fragen?

Re: Excel-Datei aus Perl-Skript

am 26.03.2006 10:05:00 von Marek Stepanek

On 23.03.2006 09:04, in article dvtksj$d40$1@news.mind.de, "Christian
Kirsch" wrote:

>
> Es gibt ein Modul für das Erzeugen von Excel-Spreadsheets. Warum
> benutzt Du das nicht?


Diese Antwort war nicht sehr hilfreich. Ich bin neu hier in diesem Forum und
ich bin wirklich nicht sicher, ob diese Antwort so gemeint war: "das ist ein
Profi-Forum hier! Gib Dir gefälligst etwas Mühe!" Auf cpan.org sind
schätzungsweise unter dem Begriff "Excel" 100 Einträge. Da werde ich doch
wohl nachhaken dürfen, bevor ich mir die Manuals durchlese. If you don't
want to help, simply don't reply!


On 24.03.2006 17:46, in article e017rf$fgv$1@news.mind.de, "Christian
Kirsch" wrote:


>
> Was hindert den Anfänger daran, einen Blick in die Dokumentation zu
> werfen? Oder Google zu fragen?

Danke für den Tipp, auf diese Idee wäre ich alleine nicht gekommen!
Inzwischen habe ich die 30 Seiten Manuals von Spreadsheet::WriteExcel
gelesen, das war wohl das Modul, welches Du gemeint hast ??? Wenn ich mir
Deine Postings hier so ansehe, wirkst Du etwas arrogant und
besserwisserisch. Auf solch eine Hilfe kann ich gerne verzichten.

Peters Antworten waren sehr hilfreich und dafür möchte ich mich noch mal
recht herzlich bedanken. Ich werde Euch in Zukunft nicht mehr belästigen.
Tut mir wirklich leid, ich war redlich bemüht ...


Grüße aus München an den Rest dieser Gruppe


marek

Re: Excel-Datei aus Perl-Skript

am 26.03.2006 21:43:29 von Frank Seitz

Marek Stepanek wrote:

> Ich werde Euch in Zukunft nicht mehr belästigen.
> Tut mir wirklich leid, ich war redlich bemüht ...

Du solltest nicht unzulässig verallgemeinern.
Es ist der "spezielle Stil" von Christian Kirsch, echte oder
vermeintliche Anfänger abzuwatschen, wann immer sich die
Gelegenheit dazu bietet. Das gibt ihm irgendwas.
Darüber hinaus kommt von ihm nicht viel.
Kein Grund also, wegen seiner Bemerkungen der NG den Rücken zu kehren.
Andererseits darfst Du nicht zu zart besaitet sein,
wenn Du Dich ins Usenet begibst.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel