2016-11-16 3 views
1

Ich versuche, Zeilen aus einem CSV, die einen der Werte in einem Array enthalten, herauszufiltern.Verwenden von Arrays mit Where-Objekt zum Filtern mehrerer Zeichenfolgen aus einem csv

diesen Beitrag als Referenz: Use -notlike to filter out multiple strings in PowerShell

schaffte ich es mit diesem Format arbeiten zu lassen:

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notlike "*${Report2a}*" 
     -and $_."SubmitterName" -notlike "*${Report2b}*" 
     -and $_."SubmitterName" -notlike "*${Report2c}*"} | 
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation 

Schließlich plane ich das Skript zu umschreiben, damit es die Ausschlussliste aus einem Text ziehen wird Datei, die von einem Endbenutzer generiert wird. Um das zu tun, muss ich auf Werte in einem Array zugreifen. Ich habe versucht, dass mit der folgenden Syntax zu tun, aber es hat nicht funktioniert wie beabsichtigt:

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notlike "*${Report2[0]}*" 
     -and $_."SubmitterName" -notlike "*${Report2[1]}*" 
     -and $_."SubmitterName" -notlike "*${Report2[2]}*"} | 
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation 

Ich habe das Gefühl, es ist nur eine Syntax Problem, aber mit ihm um viel zu lange nach dem Spiel für, ich habe laufen aus Ideen. Ich habe das Gefühl, es ist ein Syntaxproblem

Antwort

0

Dies ist ein Syntaxproblem. Die ${Name}-Syntax wird hauptsächlich für Namen verwendet, die ungerade Zeichen enthalten, wie ${A ~*Strange*~ Variable Name}. Es ist jedoch kein Ausdruck, also können Sie nicht mit [0] innerhalb der Klammern indizieren; das wäre ein wörtlicher Teil des Variablennamens.

Stattdessen können Sie einen Unterausdruck verwenden $(...) dies zu tun:

"*$($Report2[0])*" 

Als alternativen Ansatz, könnte ich Ihre ganze Reihe in einen einzigen regulären Ausdruck umwandeln und verwenden Sie dann die -match (oder -notmatch) Betreiber :

$regex = $Report2.ForEach({ [RegEx]::Escape($_) }) -join '|' 

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notmatch $regex} | 
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation 

Dies nimmt den $Report2 Array, dann eine Reihe von gleichen Werten aufbaut, sondern auch für reguläre Ausdrücke entkommen (so dass alle Sonderzeichen buchstäblich abgestimmt sind), und dann bu ILDen ein regulärer Ausdruck, der wie folgt aussieht: Abwechslung ist, so dass er sucht nach einer Übereinstimmung von Item1oderItem2 usw. Regex findet sie überall in der Zeichenfolge, so dass es nicht braucht

Item1|Item2|Item3 

In RegEx, ein Rohr ein Platzhalterzeichen, wie es -like tut.

Also mit dem gebaut, um alle Elemente in Ihrem Array vor enthalten, dann können Sie -notmatch verwenden, um die gleiche Sache zu erreichen, und Sie müssen eine Reihe von Indizes nicht fest codieren.

+0

war das! Es funktioniert jetzt einwandfrei, danke! – fudge

+1

Wenn die Elemente einfache Zeichenfolgen wären, die "-contains"/"-in" verwenden, würde das auch ohne den Overhead (und in einigen Fällen Kopfschmerzen) von Regex funktionieren. Perfekte Lösung unabhängig davon. – Matt

+0

Angenommen, die Saite war natürlich keine Teiltöne. – Matt

0

Sie enthält auch wie diese

kurze Version

[string[]]$listexludevalue=Get-Content "C:\temp\exludevalue.txt" 
Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | %{$valcontain=$true; $col=$_.Owner; $listexludevalue.ForEach({$valcontain=$valcontain -and !$col.Contains($valuetotest)}); if ($valcontain) {$_} } | Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation 

detaillierte Version verwenden können: es

$listexludevalue=Get-Content "C:\temp\exludevalue.txt" 

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
% { 

    $valcontain=$true 

    foreach ($valuetotest in $listexludevalue) {$valcontain=$valcontain -and !$_.SubmitterName.Contains($valuetotest)} 

    if ($valcontain) {$_} 

    } | Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation 
+0

-contains nicht, aber variable.contains ja – Esperento57

+0

enthält Arbeit mit dynamischen Inhalten, wenn Sie so, geben Sie ein Beispiel für Ihre Bestätigung bitte – Esperento57

+2

@ Esperento57 Was ich meine was war, was tun Sie, wenn die Quelldatei 5 Zeilen hat? Ihr Code funktioniert derzeit nicht. – Matt

Verwandte Themen