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:
Die b.csv sieht so aus:
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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 92139547568
Url: https://administrator.de/forum/ip-aus-json-in-csv-suchen-und-den-wert-daneben-in-die-json-schreiben-92139547568.html
Ausgedruckt am: 16.03.2025 um 04:03 Uhr
4 Kommentare
Neuester Kommentar

CSV-Datei Layout:
"VLAN";"SUBNET"
"1234";"192.168.0.0/24"
"5678";"192.168.1.0/24"
"0815";"192.168.30.0/24"
JSON-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"
}
]
Skript
# 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
}
🖖
Zitat von @Carlos19322:
Die b.csv sieht so aus:
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.
Bei den weiteren Netzwerken natürlich analog.
Sonnige Grüße
TA