114298
Goto Top

Inhalt einer .csv mit PowerShell prüfen

Hallo zusammen,

ich bin noch bisschen am hin und her überlegen wie ich das Problem am besten löse:

Ich habe eine .csv Datei. In der Spalte A sind mehrere Datensätze(94 Spalten) enthalten die mit einem { getrennt sind.
Ich möchte jetzt prüfen, ob die Datei auch vollständig ist, sprich, ich möchte prüfen, ob 94 mal das { in der Spalte A enthalten ist.
Die Datei hat 94 Spalten und mehrere tausend Zeilen. Das ist immer unterschiedlich.

Ich habe einmal überlegt, das excel zu öffnen und über Powershell eine Excel-Formel in Excel einzufügen die das prüft weil ich keine Powershell funktion gefunden habe.

Vielleicht kann mir einer ja einen Gedankenstoss geben, wie ich das mit Powershell-Funktionen lösen kann.

Besten Dank face-smile

Grüße
Memo

Content-Key: 273493

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

Printed on: April 25, 2024 at 04:04 o'clock

Mitglied: 114757
114757 Jun 01, 2015 updated at 09:21:21 (UTC)
Goto Top
Moin,
Zitat von @114298:
Ich habe eine .csv Datei. In der Spalte A sind mehrere Datensätze(94 Spalten) enthalten die mit einem { getrennt sind.
Ja wie jetzt ?? das { ist das Trennteichen der Spalten oder nur für diese innerhalb der Spalte A ??
Ich möchte jetzt prüfen, ob die Datei auch vollständig ist, sprich, ich möchte prüfen, ob 94 mal das { in
der Spalte A enthalten ist.
Dito, das Trennzeichen der CSV mehrmals in einer einzigen Spalte ?? Konfus ...
Die Datei hat 94 Spalten und mehrere tausend Zeilen. Das ist immer unterschiedlich.
Ok
Klär uns mal mit einer Beispielzeile deiner CSV auf , hat diese auch Überschriften etc. pp
Danke.

Gruß jodel32
Mitglied: 114298
114298 Jun 01, 2015 at 09:38:04 (UTC)
Goto Top
Hi,
also das ist ein Export aus einem Vorsystem. Dabei werden alle Daten (z.B. Jahr, Monat...) so automatisch exportiert, dass diese in der Spalte A mit einem Trennzeichen sind.
Bsp:
Zeile 1:Jahr{Monat{.....
Zeile 2: 2015{Januar{....
und das mehrere tausend mal

Ich möchte nun prüfen, ob es auch wirklich 95 Spalten sind (94 Trennzeichen) - habe es oben falsch geschrieben, sorry.

Anbei mal mein bisheriger Code:

$ExcelPath = <path>
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $True
$ExcelWordBook = $Excel.Workbooks.Open($ExcelPath)
$ExcelWorkSheet = $Excel.WorkSheets.item("Tabelle1")
$strFormula = &quot;=LÄNGE(A1) -LÄNGE( WECHSELN(A1;"{";""))&quot; - wobei ich in der Zeile noch einen Fehler bekomme
$Excel.Cells.Item(Zeile, 2).Formula = $strFormula

Das war mal so der Grundgedanke.
Aber das gefällt mir überhaupt nicht. Würde es gerne mit Powershell abprüfen.
Mitglied: 114757
114757 Jun 01, 2015 updated at 10:18:13 (UTC)
Goto Top
Na das geht viel, viel einfacher und schneller ...
$csv = Import-CSV 'c:\test.csv' -Delimiter '{'  
If (($csv | gm -Membertype Noteproperty).length -eq 95){
    Write-Host "Anzahl der  Spalten OK"  
} else {
    Write-Host "Datei hat nicht die geforderte Anzahl an Spalten !" -ForegroundColor Yellow  
}
Gruß jodel32
Mitglied: 114298
114298 Jun 01, 2015 at 11:25:31 (UTC)
Goto Top
Hi,

erst einmal besten Dank natürlich.
Hier läuft der aber nicht alle Zeilen durch sonder prüft nur ob die Spalten da sind. Wenn in Zeile 1234 nur 93 Spalten befüllt sind fällt das nicht auf?!

Und ich bekomme, wenn ich nur die csv importiere immer dieselbe Ausgabe, egal ob mit oder ohne delimiter.

Grüße
Memo
Mitglied: 114757
114757 Jun 01, 2015 updated at 11:42:39 (UTC)
Goto Top
Zitat von @114298:
Hier läuft der aber nicht alle Zeilen durch sonder prüft nur ob die Spalten da sind.
Dann sollte man das auch explizit erwähnen face-confused
Ist aber kein Beinbruch ... wie heißt die letzte Spalte ? Dann mach ich dir den Code ...
$csv = Import-CSV 'c:\test.csv' -Delimiter '{'  
$rows_not_ok = $csv | ?{$_.CQ -eq ''}  
write-host "Folgende Zeilen sind nicht vollständig:"  
$rows_not_ok
Mitglied: 114298
114298 Jun 01, 2015 at 11:40:11 (UTC)
Goto Top
Das wäre die Spalte CQ
Mitglied: 114757
114757 Jun 01, 2015 updated at 11:50:11 (UTC)
Goto Top
Siehe oben....

So geht's alternativ aber auch, falls die Datei nicht CSV Konform sein sollte :
$csv = gc "C:\temp\daten.csv"  
$rows_not_ok = $csv | select -skip 1 | ?{$_.Split("{").Length -lt 95}  
if ($rows_not_ok){
    write-host "Folgende Zeilen sind nicht OK:" -ForegroundColor Yellow  
    $rows_not_ok
}
Mitglied: 114298
114298 Jun 01, 2015 at 11:53:59 (UTC)
Goto Top
funktioniert, vielen Dank!

eine kleine Frage hätte ich noch, kann ich irgendwie die Zeilennummer mit ausgeben?
Bei mehreren tausend Datensätzen die alle ähnlich aussehen ist es dann doch ziemlich schwer die Zeilen ausfindig zu machen.
Mitglied: 114757
Solution 114757 Jun 01, 2015 updated at 12:26:17 (UTC)
Goto Top
$csv = gc "C:\temp\daten.csv"  
1..($csv.Length - 1) | %{
    if ($csv[$_].Split("{").Length -lt 95){  
        write-host "Zeile: $($_ + 1) ist nicht vollständig"  
    }
}
Mitglied: 114298
114298 Jun 01, 2015 at 12:26:12 (UTC)
Goto Top
Danke dir vielmals face-smile