Array Verarbeitung - Elemente verketten

Array Verarbeitung - Elemente verketten

am 14.07.2007 17:27:01 von Stefan Kubina

Hallo zusammen,

habe ein neues Problemchen.

habe z.b. folgendes Array:

use strict;
use warnings;

my @data = (
23_! 0.00 ! 09.11.2004 ! 3500.00 ! 24_!
0.00 ! 07.12.2004 ! 5000.00 ! 25_! 0.00 !
16.12.2004 ! 5000.00 ! 26_! 0.00 ! 03.01.2005
! 1072.40 ! 23_! 0.00 ! 0 ! N
! MIGRATOR ! 24_! 0.00 ! 0 ! N
! MIGRATOR ! 25_! 0.00 ! 0 ! N
! MIGRATOR ! 26_! 0.00 ! 0 ! N
! MIGRATOR ! 23_! 30.04.2007 !
24_! 30.04.2007 !
25_! 30.04.2007 !
26_! 30.04.2007 ! );

z.B. 23_ ist die Angabe einer Zeilennummer.

Nun möchte ich dieses Array auf ein anderes array umschichten, so daß
für jede ZeilenNr nur ein Array-Eintrag vorhanden ist

Als Beispiel für Zeile 23 dann:
23_! 0.00 ! 09.11.2004 ! 3500.00 ! 0.00 !
0 ! N ! MIGRATOR ! 30.04.2007 !
^
soll natürlich eine Zeile darstellen

Mir fehlt dazu alledings ein Ansatz das hinnzubekommen.

Wäre für Ideen sehr dankbar ;)

--
MfG Stefan Kubina

"Entwededer man lebt, oder man ist konsequent." Erich Kästner
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 11:46:48 von Wolf Behrenhoff

Stefan Kubina schrieb:
> Hallo zusammen,
>
> habe ein neues Problemchen.
>
> habe z.b. folgendes Array:
>
> use strict;
> use warnings;
>
> my @data = (
> 23_! 0.00 ! 09.11.2004 ! 3500.00 ! 24_!
> 0.00 ! 07.12.2004 ! 5000.00 ! 25_! 0.00 !
> 16.12.2004 ! 5000.00 ! 26_! 0.00 ! 03.01.2005
> ! 1072.40 ! 23_! 0.00 ! 0 ! N
> ! MIGRATOR ! 24_! 0.00 ! 0 ! N
> ! MIGRATOR ! 25_! 0.00 ! 0 ! N
> ! MIGRATOR ! 26_! 0.00 ! 0 ! N
> ! MIGRATOR ! 23_! 30.04.2007 !
> 24_! 30.04.2007 !
> 25_! 30.04.2007 !
> 26_! 30.04.2007 ! );

Das gibt bei mir einen Syntaxfehler!

Wenn ich dich aber richtig verstehe, hast du ein eindimensioales Array,
in dem alle Daten drin sind - und wenn du \d+_ liest, fängt eine neue
Zeile an?

> Nun möchte ich dieses Array auf ein anderes array umschichten, so daß
> für jede ZeilenNr nur ein Array-Eintrag vorhanden ist

Was für Zahlen hast du denn als Zeilennummern? Viele kleine fortlaufende
oder beliebige?

Im letzten Fall würde ich einen Hash verwenden, die Zeilennummer als
Key. Als Value dann eine Referenz auf ein Array mit den Werten.

Also etwa so (ungetestet):

my $key;
my %sortiert;
for (@data) {
if (/^\s*(\d+)_\s*$/) {
#oder wie auch immer du die Zeilennummer identifizierst
$key=$1;
} else {
push @{$sortiert{$key}}, $_;
}
}

Wolf

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 12:36:37 von Christian Garbs

Mahlzeit!

Stefan Kubina wrote:

> habe z.b. folgendes Array:
>
> use strict;
> use warnings;
>
> my @data = (
> 23_! 0.00 ! 09.11.2004 ! 3500.00 ! 24_!
> 0.00 ! 07.12.2004 ! 5000.00 ! 25_! 0.00 !
> 16.12.2004 ! 5000.00 ! 26_! 0.00 ! 03.01.2005
> ! 1072.40 ! 23_! 0.00 ! 0 ! N
> ! MIGRATOR ! 24_! 0.00 ! 0 ! N
> ! MIGRATOR ! 25_! 0.00 ! 0 ! N
> ! MIGRATOR ! 26_! 0.00 ! 0 ! N
> ! MIGRATOR ! 23_! 30.04.2007 !
> 24_! 30.04.2007 !
> 25_! 30.04.2007 !
> 26_! 30.04.2007 ! );

Das ist kein Array, das ist kein String, das ist ein Compilefehler.
Wie sieht's denn wirklich aus?

Gruß,
Christian
--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
..'E002020001C2222221400005CA2A2A27C02001C2222221C20003E0402 02201F2422221C00'
..'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..); ;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:',y;:;\t;;print;_;_

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 13:49:26 von Stefan Kubina

Am Sun, 15 Jul 2007 11:46:48 +0200, schrieb Wolf Behrenhoff
>Das gibt bei mir einen Syntaxfehler!

Sorry, hatte nur den Inhalt kopiert nicht aber überprüft.
Folgendes Array paßt:
my @data = (
"23_! 0.00 ! 09.11.2004 ! 3500.00 !",
"24_! 0.00 ! 07.12.2004 ! 5000.00 !",
"25_! 0.00 ! 16.12.2004 ! 5000.00 !",
"26_! 0.00 ! 03.01.2005 ! 1072.40 !",
"23_! 0.00 ! 0 ! N ! MIGRATOR !",
"24_! 0.00 ! 0 ! N ! MIGRATOR !",
"25_! 0.00 ! 0 ! N ! MIGRATOR !",
"26_! 0.00 ! 0 ! N ! MIGRATOR !",
"23_! 30.04.2007 !",
"24_! 30.04.2007 !",
"25_! 30.04.2007 !",
"26_! 30.04.2007 !" );
>Wenn ich dich aber richtig verstehe, hast du ein eindimensioales Array,
>in dem alle Daten drin sind - und wenn du \d+_ liest, fängt eine neue
>Zeile an?
Korrekt, \d+_ definiert einen Zeilenanfang und die ZeilenNr.

>Was für Zahlen hast du denn als Zeilennummern? Viele kleine fortlaufende
>oder beliebige?
Fängt bei 1 bis n - also beliebig
>Im letzten Fall würde ich einen Hash verwenden, die Zeilennummer als
>Key. Als Value dann eine Referenz auf ein Array mit den Werten.
>Also etwa so (ungetestet):
Da ich von Hashes nicht viel verstehe :-( Ich werde es aber gleich
mal probieren...

Danke schon mal vorab... ;-)

--
MfG Stefan Kubina

"Entwededer man lebt, oder man ist konsequent." Erich Kästner
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 13:51:14 von Stefan Kubina

Am Sun, 15 Jul 2007 12:36:37 +0200 (CEST), schrieb Christian Garbs
>Das ist kein Array, das ist kein String, das ist ein Compilefehler.
>Wie sieht's denn wirklich aus?
Sorry, hatte nur den Inhalt aus dem text kopiert

Hier der korrekte Array8-auszug):

my @data = (
"23_! 0.00 ! 09.11.2004 ! 3500.00 !",
"24_! 0.00 ! 07.12.2004 ! 5000.00 !",
"25_! 0.00 ! 16.12.2004 ! 5000.00 !",
"26_! 0.00 ! 03.01.2005 ! 1072.40 !",
"23_! 0.00 ! 0 ! N ! MIGRATOR !",
"24_! 0.00 ! 0 ! N ! MIGRATOR !",
"25_! 0.00 ! 0 ! N ! MIGRATOR !",
"26_! 0.00 ! 0 ! N ! MIGRATOR !",
"23_! 30.04.2007 !",
"24_! 30.04.2007 !",
"25_! 30.04.2007 !",
"26_! 30.04.2007 !" );

/\d+_/ liefert denZeilenanfang und ZeilenNr

;-)


--
MfG Stefan Kubina

"Entwededer man lebt, oder man ist konsequent." Erich Kästner
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 15:29:27 von Moritz Lenz

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig2C22E3626846509A2330C9A2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hallo,

Stefan Kubina wrote:
> Am Sun, 15 Jul 2007 12:36:37 +0200 (CEST), schrieb Christian Garbs=20
>>Das ist kein Array, das ist kein String, das ist ein Compilefehler.
>>Wie sieht's denn wirklich aus?
> Sorry, hatte nur den Inhalt aus dem text kopiert
>=20
> Hier der korrekte Array8-auszug):
>=20
> my @data =3D (
> "23_! 0.00 ! 09.11.2004 ! 3500.00 !",
> "24_! 0.00 ! 07.12.2004 ! 5000.00 !",
> "25_! 0.00 ! 16.12.2004 ! 5000.00 !",
> "26_! 0.00 ! 03.01.2005 ! 1072.40 !",
> "23_! 0.00 ! 0 ! N ! MIGRATOR !",
> "24_! 0.00 ! 0 ! N ! MIGRATOR !",
> "25_! 0.00 ! 0 ! N ! MIGRATOR !",
> "26_! 0.00 ! 0 ! N ! MIGRATOR !",
> "23_! 30.04.2007 !",
> "24_! 30.04.2007 !",
> "25_! 30.04.2007 !",
> "26_! 30.04.2007 !" );
>=20
> /\d+_/ liefert denZeilenanfang und ZeilenNr

Für Felder fester Breite eignet sich unpack(), du solltest
perldoc perlpacktut
lesen.

Grüße,
Moritz

--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/


--------------enig2C22E3626846509A2330C9A2
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGmiE9AAkekJBI0yIRAvCQAKDREV0EXM785jvYE3Po9h8F1RXp2ACe KAIB
CFKl9tQU1qLx/jM8D3CxtUg=
=m1XX
-----END PGP SIGNATURE-----

--------------enig2C22E3626846509A2330C9A2--

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:19:13 von Wolf Behrenhoff

Stefan Kubina schrieb:
> Am Sun, 15 Jul 2007 11:46:48 +0200, schrieb Wolf Behrenhoff
>> Was für Zahlen hast du denn als Zeilennummern? Viele kleine fortlaufende
>> oder beliebige?
> Fängt bei 1 bis n - also beliebig

Na, wenn die Zahlen von 1 bis n laufen, dann würde ich keinen Hash
nehmen, sondern einfach ein Array of Array.

Vielleicht solltest du mal `perldoc perllol` lesen?

Wolf

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:22:40 von Stefan Kubina

Am Sun, 15 Jul 2007 15:29:27 +0200, schrieb Moritz Lenz
>Für Felder fester Breite eignet sich unpack(), du solltest
>perldoc perlpacktut
>lesen.
Die Feldlänge ist extrem variabel, d.h. ich kann mich auf keine Längen
verlassen...
unpck ist da nicht anwendbar, daanke für den Hinweis... ;-)

MfG Stefan Kubina
--
Don't fear, it's just me...
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:27:38 von Moritz Lenz

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enigA029899955AB7DB814C308AE
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hallo,

Stefan Kubina wrote:
> Am Sun, 15 Jul 2007 15:29:27 +0200, schrieb Moritz Lenz=20
>>Für Felder fester Breite eignet sich unpack(), du solltest
>>perldoc perlpacktut
>>lesen.
> Die Feldlänge ist extrem variabel, d.h. ich kann mich auf keine Län=
gen
> verlassen...
> unpck ist da nicht anwendbar, daanke für den Hinweis... ;-)

Dann solltest du uns mehr Beispieldaten geben. Die Daten, die du bisher
gepostet hattest, sahen so aus, als ob nur zwei Feldlängen vorkommen kö=
nnen.

Letztendlich muss es ein Kriterium geben, wie diese Daten strukturiert
sind, und anhand dessen man sie auch wieder auseinandernehmen kann. Aber
wenn die Beispieldaten, die du uns gibst, nicht repräsentativ sind, und=

uns auch nicht über die Struktur der Daten aufklärst, können wir di=
r
nicht helfen.

Grüße,
Moritz

--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/


--------------enigA029899955AB7DB814C308AE
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGmi7aAAkekJBI0yIRAmXtAJ4hrHWxtJegqIcXN4Y7C3hKsHf6YgCf Xnz8
9GW2Rlf2QddI1buT5SlYLfo=
=ESHF
-----END PGP SIGNATURE-----

--------------enigA029899955AB7DB814C308AE--

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:31:48 von Stefan Kubina

Am Sun, 15 Jul 2007 16:19:13 +0200, schrieb Wolf Behrenhoff
>Na, wenn die Zahlen von 1 bis n laufen, dann würde ich keinen Hash
>nehmen, sondern einfach ein Array of Array.
>
>Vielleicht solltest du mal `perldoc perllol` lesen?

Uff... da blicke ich nicht durch....
Mein Englisch ist zwar akzeptabel, aber dabei schalte ich dann doch
ab..

Ich denke Array slicen geht in die Richtung in die ich eine Lösung
brauche... doch.. zuwenig Plan... :-(

MfG Stefan Kubina
--
Don't fear, it's just me...
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:41:38 von Stefan Kubina

Am Sun, 15 Jul 2007 16:27:38 +0200, schrieb Moritz Lenz
>Dann solltest du uns mehr Beispieldaten geben. Die Daten, die du bisher
>gepostet hattest, sahen so aus, als ob nur zwei Feldlängen vorkommen können.
>
>Letztendlich muss es ein Kriterium geben, wie diese Daten strukturiert
>sind, und anhand dessen man sie auch wieder auseinandernehmen kann. Aber
>wenn die Beispieldaten, die du uns gibst, nicht repräsentativ sind, und
>uns auch nicht über die Struktur der Daten aufklärst, können wir dir
>nicht helfen.
Die Eingabedaten kommen aus einer Datei. Die Inhalte der Daatei habe
ich schon soweit aufbereitet, wie in dem Array ersichtlich.
Es gibt als festes Element die zeilenNr /d+_/ gefolgt von einem
beliebigen String der mit ! anfängt und ! aufhört
/([a-zA-Z0-9,\.?-]*)/
Gesamt also läßt sich eine einzelne Zeile so aufteilen:
/(\s+)([!a-zA-Z0-9,\.?-]*)(\s+!)/gm

Mein Problem an der Stelle ist halt, daß die ZeilenNr mehrfach
vorkommen und an sich zusammen gehören. Der Inhalt nach der ZeilenNr
ist ein anderer als zuvor.

Ich möchte also aus mehreren Vorkommen einer ZeilenNr eine einzige
zusammenhängende Zeile machen.
Ziel ist dann, darau auch noch pro zeile die Daten dann zu spitten,
was anhhand der ' ! ' als Trennzeichen kein problem darstellt.

Ich hoffe es wird ein wenig klarer ;-)

MfG Stefan Kubina
--
Don't fear, it's just me...
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:43:27 von Stefan Kubina

Am Sun, 15 Jul 2007 16:41:38 +0200, schrieb Stefan Kubina
>Gesamt also läßt sich eine einzelne Zeile so aufteilen:
>/(\s+)([!a-zA-Z0-9,\.?-]*)(\s+!)/gm
/(\d+_)([!a-zA-Z0-9,\.?-]*)(\s+!)/gm meine ich natürlich

MfG Stefan Kubina
--
Don't fear, it's just me...
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:54:11 von Stefan Kubina

Am Sun, 15 Jul 2007 16:41:38 +0200, schrieb Stefan Kubina
>Gesamt also läßt sich eine einzelne Zeile so aufteilen:
>/(\s+)([!a-zA-Z0-9,\.?-]*)(\s+!)/gm
Oder noch besser:
/(\d+_)(!\s+.*\s+!)/gm

MfG Stefan Kubina
--
Don't fear, it's just me...
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 16:55:35 von Wolf Behrenhoff

Stefan Kubina schrieb:
> Am Sun, 15 Jul 2007 12:36:37 +0200 (CEST), schrieb Christian Garbs
>> Das ist kein Array, das ist kein String, das ist ein Compilefehler.
>> Wie sieht's denn wirklich aus?
> Sorry, hatte nur den Inhalt aus dem text kopiert
>
> Hier der korrekte Array8-auszug):
>
> my @data = (
> "23_! 0.00 ! 09.11.2004 ! 3500.00 !",
> "24_! 0.00 ! 07.12.2004 ! 5000.00 !",
> "25_! 0.00 ! 16.12.2004 ! 5000.00 !",
> "26_! 0.00 ! 03.01.2005 ! 1072.40 !",
> "23_! 0.00 ! 0 ! N ! MIGRATOR !",
> "24_! 0.00 ! 0 ! N ! MIGRATOR !",
> "25_! 0.00 ! 0 ! N ! MIGRATOR !",
> "26_! 0.00 ! 0 ! N ! MIGRATOR !",
> "23_! 30.04.2007 !",
> "24_! 30.04.2007 !",
> "25_! 30.04.2007 !",
> "26_! 30.04.2007 !" );

Ich dachte nach deinen Ursprungsposting, dass die Daten schon gesplittet
sind.

Nun denn, dann eben so;

my %sortiert;
for (@data) {
@arr = split /!/, $_;
push @{$sortiert{shift @arr}}, @arr;
}
use Data::Dumper;print Dumper \%sortiert;

Wolf

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 17:13:57 von Stefan Kubina

Am Sun, 15 Jul 2007 16:55:35 +0200, schrieb Wolf Behrenhoff
>Nun denn, dann eben so;
>
>my %sortiert;
>for (@data) {
> @arr = split /!/, $_;
> push @{$sortiert{shift @arr}}, @arr;
>}
>use Data::Dumper;
>print Dumper \%sortiert;

PERFEKT !
Das waren dann schon 2 Schritte in einem... Werde mir wohl das noch
einige Zeit anschauen müssen, bis ich kapiere, was da passierrt.

Tausend Dank :-))

--
MfG Stefan Kubina

"Entwededer man lebt, oder man ist konsequent." Erich Kästner
Homepage: http://www.JustMe69.de - http://www.SKubIO-Media.de
ICQ:#45202585

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 21:47:41 von Mirco Wahab

Stefan Kubina wrote:
> Am Sun, 15 Jul 2007 16:55:35 +0200, schrieb Wolf Behrenhoff
>> my %sortiert;
>> for (@data) {
>> @arr = split /!/, $_;
>> push @{$sortiert{shift @arr}}, @arr;
>> }
>> use Data::Dumper;
>> print Dumper \%sortiert;
>
> PERFEKT !
> Das waren dann schon 2 Schritte in einem... Werde mir wohl das noch
> einige Zeit anschauen müssen, bis ich kapiere, was da passierrt.


Wolf hatte ja eine variante nur mit Arrays vorgeschlagen.
Ich weiss nicht genau, wie Dein Endergebnis aussehen soll,
aber im Prinzip gänge das bei Deinen letztgenannten Daten so:

...
my @seq;

for (@data) {
my ($t, @t) = split /[_!\s]+/;
$seq[$t] = "$t>>" unless defined $seq[ $t ];
$seq[$t] .= " @t"
}

print map "$_\n", grep defined, @seq;
...

Hier würdest Du also die erste "Zahl" als
Feldindex verwenden ($t) und die restlichen
korrespondierenden Daten jeweils "anhängen"
(wenn das so gedacht war).

Viele Grüße

Mirco

Re: Array Verarbeitung - Elemente verketten

am 15.07.2007 23:13:15 von Ch Lamprecht

Stefan Kubina schrieb:
> Am Sun, 15 Jul 2007 16:19:13 +0200, schrieb Wolf Behrenhoff
>
>>Na, wenn die Zahlen von 1 bis n laufen, dann würde ich keinen Hash
>>nehmen, sondern einfach ein Array of Array.
>>
>>Vielleicht solltest du mal `perldoc perllol` lesen?
>
>
> Uff... da blicke ich nicht durch....
> Mein Englisch ist zwar akzeptabel, aber dabei schalte ich dann doch
> ab..
>

Hallo,

hier gibt es ein paar übersetzte perldocs (z.B. perldsc):

http://wiki.perl-community.de/bin/view/Perldoc/perldsc

Grüße,

--
perl -e 'print scalar reverse q/ed.enilno@ergn.l.hc/'