Thread IP Mapping (10 answers)
Opened by LOADBALANCER at 2021-06-29 15:53

haj
 2021-06-29 21:06
#193378 #193378
User since
2015-01-07
558 Artikel
BenutzerIn

user image
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 CPAN: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 Perldoc:perllol beschrieben.

Das geht dann beispielsweise so:
Code (perl): (dl )
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; # Erste Zeile brauchen wir nicht
my @data = map [ split /\s*;\s*/ ],  @lines; # Array of Arrays!

open (my $ehe,'>',$ausgabe)
    or die "Fehler beim Oeffnen der Datei '$ausgabe': '$!'\n";
say $ehe "Ip;destination;vrf;kuerzel;umgebung";

for my $area (@areas) {            # fuer alle drei Areas
    my @brides = @data;            # und alle Adressen
    my @grooms = @data;            # zu allen Partnern
    for my $bride (@brides) {
        shift @grooms;             # nur "vorwärts" verknüpfen
      MARRIAGE:
        for my $groom (@grooms) {
            my $ip          = $bride->[1];
            my $destination = $groom->[1];
            my $kuerzel     = $groom->[2];
            my $vrf         = $area;        # ?? soll's das sein?
            my $umgebung    = $groom->[4];  # ?? Das fehlt im Beispiel?
            say $ehe "$ip;$destination;$vrf;$kuerzel;$umgebung";
        }
    }
}

close $ehe;
say "Geschafft.";

View full thread IP Mapping