carlos19322
Goto Top

IP aus JSON in .csv suchen und den Wert daneben in die JSON schreiben

Hallo zusammen,

ich bitte um Hilfe und benötige eure gebündelte Expertise im Bereich PowerShell.

Ich habe Folgendes vor:

Im Ordner
c:\Test
befinden sich Dateien
a.json und b.csv

a.json sieht folgendermaßen aus:
[
    {
        "Datum":  "Date",  
        "IP-Adresse":  "192.168.1.1",  
        "Name":  "Name",  
        "Inhalt1":  "Contents1",  
        "Inhalt2":  "Contents2",  
        "Inhalt3":  "Contents3"  
    },
{
        "Datum":  "Date",  
        "IP-Adresse":  "192.168.30.20",  
        "Name":  "Name",  
        "Inhalt1":  "Contents1",  
        "Inhalt2":  "Contents2",  
        "Inhalt3":  "Contents3"  
    }
]

Die b.csv sieht so aus:
VLAN	IP-Bereich von	IP-Bereich bis
1234	192.168.0.0	192.168.0.254
5678	192.168.1.0	192.168.1.254
0815	192.168.30.0	192.168.30.254

Die b.csv ist nicht mit Trennzeichen getrennt, sondern auf 3 Spalten aufgeteilt.
Wenn ihr allerdings sagt, das ist doof, dann kann ich das auch als .txt oder durch Semikolon getrennt oder auch in einer JSON abbilden.
Wichtig ist, dass es IP-Adress-Bereiche gibt, die wiederum einem VLAN zugeordnet sind.

Die Daten in der b.csv sind fix. Die Daten in der a.json werden täglich generiert und in dem Ordner c:\Test mit Zeitstempel im Namen abgelegt. Die Datei b.json kann auch mal ein paar tausend Einträge haben.


Nun zu meinem Anliegen.
Ich möchte gerne jedes Array in der b.json um die Zeile "VLAN" erweitern.
*Array ist doch richtig oder?*
Sodass am Ende folgendes herauskommt:
[
    {
        "Datum":  "Date",  
        "IP-Adresse":  "192.168.1.1",  
        "VLAN": "5678",  
        "Name":  "Name",  
        "Inhalt1":  "Contents1",  
        "Inhalt2":  "Contents2",  
        "Inhalt3":  "Contents3"  
    },
{
        "Datum":  "Date",  
        "IP-Adresse":  "192.168.30.20",  
        "VLAN": "0815",  
        "Name":  "Name",  
        "Inhalt1":  "Contents1",  
        "Inhalt2":  "Contents2",  
        "Inhalt3":  "Contents3"  
    }
]

Die Datei darf dann gerne mit demselben Namen im Unterordner c:\Test\Konv abgelegt werden.

Leider habe ich hier überhaupt keine Vorstellung, wie ich hier herangehen soll.

Ich bedanke mich schon mal und hoffe, ihr könnt mir helfen.

Liebe Grüße
euer Carlos

Content-Key: 92139547568

Url: https://administrator.de/contentid/92139547568

Printed on: April 28, 2024 at 18:04 o'clock

Mitglied: 11078840001
Solution 11078840001 Mar 08, 2024 updated at 15:33:00 (UTC)
Goto Top
back-to-topCSV-Datei Layout:

"VLAN";"SUBNET"  
"1234";"192.168.0.0/24"  
"5678";"192.168.1.0/24"  
"0815";"192.168.30.0/24"  

back-to-topJSON-File Layout

[
    {
        "Datum":  "Date",    
        "IP-Adresse":  "192.168.1.1",    
        "Name":  "Name",    
        "Inhalt1":  "Contents1",    
        "Inhalt2":  "Contents2",    
        "Inhalt3":  "Contents3"    
    },
{
        "Datum":  "Date",    
        "IP-Adresse":  "192.168.30.20",    
        "Name":  "Name",    
        "Inhalt1":  "Contents1",    
        "Inhalt2":  "Contents2",    
        "Inhalt3":  "Contents3"    
    }
]

back-to-topSkript

# Quellordner
$folder = "C:\Test"  
# Zielordner
$folder_converted = "C:\Test\konv"  
# CSV-Datei
$csvfile = "C:\test\b.csv"  
############################
# Zielordner erstellen falls nötig
if (!(Test-Path $folder_converted -PathType Container)){new-item -type dir -Path $folder_converted -Force | out-null}

# wenn CSV-Datei nicht existiert -> exit
if (!(Test-Path $csvfile -PathType Leaf)){
    write-error -Message "CSV-Datei existiert nicht!"  
    return
}

# CSV Datei importieren
$csv = Import-CSV $csvfile -Delimiter ";"  

# funktion zum Prüfen ob eine IP in einem Subnetz enthalten ist
function Range-ContainsIP {
    param(
        [parameter(mandatory=$true)][ValidateScript({$_ -match '^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])/([0-9]|[1-2][0-9]|3[0-2])$'})][string]$netrange,  
        [parameter(mandatory=$true)][ValidateScript({$_ -match '^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$'})][string]$ip  
    )
    $mask = $netrange.split('/')[-1].trim()  
    $net = [ipaddress]$netrange.split('/')[0].trim()  
    $convert = {
        param($ip,$mask)
        (($ip.GetAddressBytes() | %{[System.Convert]::ToString($_,2).padLeft(8,'0')}) -join '').Substring(0,$mask)  
    }
    (&$convert $net $mask) -eq (&$convert ([ipaddress]$ip) $mask)
}

# für jede JSON Datei im Ordner
foreach($json in Get-ChildItem $folder -File -Filter *.json){
    # JSON Datei in Object konvertieren
    $objects = Get-Content $json.Fullname -Raw | ConvertFrom-Json
    # Zeilen der CSV druchlaufen
    foreach($object in $objects){
        # passendes VLAN für IP in CSV finden
        $vlan = $csv | ?{Range-ContainsIP -netrange $_.SUBNET  -ip $object.'IP-Adresse'} | % VLAN  
        if ($vlan){
            # VLAN dem object hinzufügen
            $object | Add-Member -Membertype Noteproperty -Name VLAN -Value $vlan -Force
        }
    }
    # neue JSON Daten in den Zielordner schreiben
    $objects | ConvertTo-JSON -Depth 100 | set-content -Path (join-path $folder_converted $json.Name) -verbose
}

🖖
Member: TwistedAir
TwistedAir Mar 09, 2024 updated at 13:46:20 (UTC)
Goto Top
Zitat von @Carlos19322:

Die b.csv sieht so aus:
VLAN	IP-Bereich von	IP-Bereich bis
1234	192.168.0.0	192.168.0.254
5678	192.168.1.0	192.168.1.254
0815	192.168.30.0	192.168.30.254

Moin,

als staatlich ungeprüfter Korinthenkacker muss ich anmerken, dass der IP-Bereich für ein /24er Netzwerk konsequenterweise entweder von 192.168.0.0 bis 192.168.0.255 (inkl. „Netzwerkname“ und Broadcast) oder von 192.168.0.1 bis 192.168.0.254 (IPs für Rechner) gehen sollte. face-wink
Bei den weiteren Netzwerken natürlich analog.

Sonnige Grüße
TA
Member: Carlos19322
Carlos19322 Mar 11, 2024 at 14:17:48 (UTC)
Goto Top
Ihr seid sooo MEGA,
abramakabra du bist MEGA.
Vielen, vielen Dank.
Das Skript hat sofort funktioniert, ich bin baff.

Vor allem hatte ich vergessen zu erwähnen, dass ich zusätzlich auch Adressbereiche im 23er, 25er, 26er, 27er und 28er-Netz habe.
Aber dein Skript hat das alles sauber durchgejagt.

Klasse, vielen Dank.
Ich bin echt Happy.

Kann man hier so etwas wie *Daumen Hoch* geben oder liken?

Vielen Dank und liebe Grüße
Carlos
Member: Carlos19322
Carlos19322 Mar 11, 2024 at 14:21:29 (UTC)
Goto Top
Hallo TwistedAir,

Danke für den Hinweis face-smile Du hast natürlich recht.
Ich achte nächstes Mal darauf.

Liebe Grüße

Carlos