nagus
Goto Top

Powershell: Leere Zeilen aus Array entfernen

Moin zusammen,

vermutlich ganz trivial zu lösen aber ich habe nix gefunden, was mich auf die richtige Spur bringt.

Ausgangslage:
Ich lese eine CV Datei ein, in der Spaltennamen enthalten sind, hier nur mal drei exemplarische
Name; Vorname; ID; 
Mustermann; Max; MAXMU;
;;;
;;;

Da ich die Spaltennamen im Script direkt in schleifen ($c.name etc.) anspreche brauche ich die.
Die Liste die ich einlese, kommt aus unterschiedlichen Quellen, einmal aus einem System, das andere mal aus einer Vorlage für User.
Speziell bei der Vorlage für User habe ich unter umständen viele Leerzeilen, die ich herausfiltern möchte.

Mein Ansatz wäre jetzt, die Datei in ein Array einzulesen und alle befüllten Zeilen in eine anderes Array zu schreiben, welche ich anschließend weiter verwende.

Bis jetzt habe ich nur die Varianten gefunden, um das umzusetzen:
1. Array aus einer Leeren CSV Datei erstellen, in der nur die Spaltennamen enthalten sind
2. Array erstellen und mit ADD-Member jede Spalte einzeln erstellen.
3. Array kopieren und dann die Leerzeilen löschen (hier scheiterts)
4. Array komplett leeren, und dann zeilenweise in das leere schreiben, Wenn ich versuche das Array zu leeren, verliere ich aber auch immer die Spalten.

Ich bin fortgeschrittener Anfänger ...

Thx für Ideen oder Hinweise
Nagus

Content-ID: 1499380818

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

Ausgedruckt am: 05.11.2024 um 04:11 Uhr

TK1987
Lösung TK1987 12.11.2021 um 16:06:00 Uhr
Goto Top
Moin,

$Source = "C:\Pfad\zur\Datei.csv"  

$CSV = Get-Content $Source | Where-Object {$_ -NotMatch "^[ ;]*$"} | ConvertFrom-CSV -Delimiter ";"  

Gruß Thomas
Nagus
Nagus 12.11.2021 um 16:53:38 Uhr
Goto Top
Teufelswerk Oo
funktioniert ....

Kannst du mir noch den Teil erklären?
"^[ ;]*$"}  
Warum das Dach und dann *$?

Thx

Was ich noch gefunden hatte wäre das, von Microsoft hier

eine Funktion um die Properties zu kopieren - funktioniert bei mir aber nicht ...
function Copy-Property ($From, $To)
{
    $properties = Get-Member -InputObject $From -MemberType Property
    foreach ($p in $properties)
    {
        $To | Add-Member -MemberType NoteProperty -Name $p.Name -Value $From.$($p.Name) -Force
    }
}
149569
149569 12.11.2021 aktualisiert um 18:26:16 Uhr
Goto Top
Zitat von @Nagus:
Kannst du mir noch den Teil erklären?
"^[ ;]*$"}  
Warum das Dach und dann *$?

Erklärung
^[ ;]*$
Assert position at the beginning of a line «^»
Match a single character from the list “ ;” «[ ;]*»
Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Assert position at the end of a line «$»

Ergo nur Zeilen die nicht nur Leerzeichen oder Semikolons von Anfang bis Ende der Zeile besitzen werden übernommen.
Das Leerzeichen könnte man noch durch ein \s ersetzen dann werden auch Tabs und andere unsichtbare Zeichhen identifziert

Was ich noch gefunden hatte wäre das, von Microsoft hier

eine Funktion um die Properties zu kopieren - funktioniert bei mir aber nicht ...
function Copy-Property ($From, $To)
> {
>     $properties = Get-Member -InputObject $From -MemberType Property
>     foreach ($p in $properties)
>     {
>         $To | Add-Member -MemberType NoteProperty -Name $p.Name -Value $From.$($p.Name) -Force
>     }
> }

Die ändert ja auch nix ...

function Copy-Property {
    param([io.fileinfo]$from,[IO.FileInfo]$to)
    gm -InputObject $from -MemberType Property | ?{$_.Definition -match 'set;'} | select -Expand Name | %{$to.$_ = $from.$_}  
}

$a = gi D:\test1.txt
$b = gi D:\test2.txt

Copy-Property $a $b