Hallo LOADBALANCER,
Du weißt ja vermutlich selbst, dass Du die Aufgabe nicht so ganz klar beschrieben hast. Ich rate also mal:
- vrf (was in Deiner Eingabe leer ist) soll mit den Areas versorgt werden.
- umgebung soll tatsächlich auch in der Ausgabedatei erscheinen
- Jede Paarung id->destination soll nur einmal erscheinen, d.h. wenn Server01->Server02 ausgegeben wurde, soll Server02->Server01 nicht mehr erscheinen
Das Aufspalten der einzelnen Zeilen nach den Semikolons ist sicher ein entscheidender Schritt. Wenn in Deiner Datei CSV-Strings enthalten sein können
oder einzelne Elemente auch mal ein Newline enthalten können, dann solltest Du die Auswertung mit einem "richtigen" CSV-Parser erledigen, ich empfehle dafür
Text::CSV_XS.
Der Rest ist eigentlich ganz klassisch: Du musst für das Verheiraten einfach eine geschachtelte Schleife verwenden. Was ich hier mache, ist der Aufbau eines "Array of Arrays" (AoA) aus den Eingabedaten, das ist in
perllol beschrieben.
Das geht dann beispielsweise so:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use 5.020;
use warnings;
my $device_csv = <<EOF;
name;ip;kuerzel;vrf;umgebung
adresse01;192.168.209.11;Server01;;buero
adresse02;192.168.209.72; Server02;; buero
adresse03;192.168.227.72; Server03;; buero
adresse04;192.168.195.11; Server04;; buero
adresse05;192.168.223.11; Server05;; buero
adresse06;192.168.197.11; Server06;; buero
adresse07;192.168.197.72; Server07;; buero
EOF
my @areas = qw(area1 area2 area3);
my $ausgabe = 'Ausgabe.csv';
my @lines = split /\n/,$device_csv;
my @headers = split /\s*;\s*/, shift @lines;
my @data = map [ split /\s*;\s*/ ], @lines;
open (my $ehe,'>',$ausgabe)
or die "Fehler beim Oeffnen der Datei '$ausgabe': '$!'\n";
say $ehe "Ip;destination;vrf;kuerzel;umgebung";
for my $area (@areas) {
my @brides = @data;
my @grooms = @data;
for my $bride (@brides) {
shift @grooms;
MARRIAGE:
for my $groom (@grooms) {
my $ip = $bride->[1];
my $destination = $groom->[1];
my $kuerzel = $groom->[2];
my $vrf = $area;
my $umgebung = $groom->[4];
say $ehe "$ip;$destination;$vrf;$kuerzel;$umgebung";
}
}
}
close $ehe;
say "Geschafft.";