2017-02-15 7 views
1

Ich habe ein Problem beim Extrahieren bestimmter Werte aus einem Array. Ich habe ein Array, das 40010 Zeilen enthält, von denen jede eine Reihe von röhrengetrennten Werten ist (64 in jeder Zeile).Extrahieren von Werten aus Zeichenfolgen in einem Array mit Powershell

Ich muss die Werte 7, 4, 22, 23, 24, 52 und 62 aus jeder Zeile extrahieren und in ein neues Array schreiben, so dass ich ein neues Array mit 40010 Zeilen mit nur 7 getrennten Pipe bekomme Werte in jeder Zeile (könnte durch Kommas getrennt sein).

Ich habe Split angeschaut und kann nicht meinen Kopf herumkommen, um auch nur annähernd zu erreichen, was ich brauche.

Ich würde auch offen sein, das aus einer Datei zu tun, wie ich zur Zeit mit meinem ersten Array erstellen
$data = (Get-content $statement_file|Select-String "^01")

Wenn ich auf diesen Befehl hinzufügen kann die Spaltung am Eingang zu tun, damit ich haben nur ein Array und brauchen kein Zwischenarray, das wäre noch besser.

Ich weiß, wenn ich in Linux war ich die Spaltung mit AWK ganz leicht tun könnte, aber ich bin ziemlich neu, so Powershell Vorschläge schätzen würde

+0

Ich glaube, ich etwas verpasst, aber man könnte das Array bauen ohne Eingabedatei, wenn Sie die Werte und die Anzahl der Zeilen kennen. – sodawillow

Antwort

4
# create an array of header columns (assuming your pipe separated file doesn't have headers) 
$header = 1..64 | ForEach-Object { "h$_" } 

# import the file as 'csv' but with pipes as separators, use the above header, then select columns 7,4,22,23,24,52,62 
# edit 1: then only return rows that start with 01 
# edit 2: then join these into a pipe separated string 
$smallerArray = $statement_file | 
    Import-Csv -Delimiter '|' -Header $header | 
    Where-Object { $_.h1.StartsWith('01') } | 
    Select-Object @{Name="piped"; Expression={ @($_.h7,$_.h4,$_.h22,$_.h23,$_.h24,$_.h52,$_.h62) -join '|' }} | 
    Select-Object -ExpandProperty piped 
+0

Das ist nah dran, was ich will, aber es gibt über 600.000 Datensätze in der Datei und ich brauche nur die 40.010, die mit 01 im ersten Feld beginnen. Das mache ich gerade,
'$ data1 = (Get-Inhalt $ statement_file | Select-String"^01 ") $ data1 | ac $ tmp_file $ data2 = $ tmp_file | Import-Csv -Delimiter '|' -Header $ header | Wählen Sie h7, h4, h22, h23, h24, h52, h62 ' – dazedandconfused

+0

Ich bearbeite, um für 01 im ersten Feld zu filtern – TechSpud

+0

Das andere Problem ist, wenn ich $ data1 [3] bekomme, bekomme ich" 01 | 456000003 | 00000012 | N | WEBB | Webb Ivory Konto | 003 | Webb Ivory | OPEN | 123000072 | Herr | Ioan | Nachname | 12 Name der Straße | Name des Districts Hier | Ort Name Hier | County Name Hier | AA11 1AA | N | 20161028 | 20161120 | 250,00 | 250,00 | 250,00 | 200,00 | 0,00 | 200,00 | 0,00 | 0,00 | 00,0 | 0,00 | 10,00 | 5,00 | N | Y | 20161120 | 5,00 ||| 0,00 | N | N | 0,00 | A | 1 | N ||| ||||||| " aber wenn ich $ Daten2 tun [3] Ich erhalte "h7: 003 h4: N H22: 250.00 H23: 250.00 H24: 250.00 H52: H62:" – dazedandconfused

Verwandte Themen