2016-08-04 32 views
0

Während eine feste Breite-Datei wie folgt zu lesen:Powershell - Regex - Breite Datei behoben - Escape-Sequenz

ABC  7112123207/24/16Smith        Timpson       Head Coach               412-222-0000  00011848660 ELl CAAN HIGH SCHOOL     325 N Peal AVE.     Smith       Timpson      Head Coach        COLORADO CITY   AZ 86021  01    FALL  MALE  07/29/16EQ15031     1977904  BUDDY'S ALL STARS INC.     BUDDY ALL STARS                                N     V12V70R16        1.00V12V70R16 

Ich wünsche das einzige Leerzeichen zu entkommen,/und das Apostroph.

ich in Powershell meine regex versucht wie folgt aus:

$Line | Select-String -Pattern "^(.*)[a-zA-Z0-9?\s?]" -AllMatches  

Ich muss die Übereinstimmungswerte wie lesen:

ABC
12345607/24/16Joe (diese Aufteilung in drei: 123456,07/24/16, Joe)
Smith
Kopf Trainer
Buddys Box

Ich versuche, die Slices zu einem CSV hinzuzufügen, wobei jeder einzelne einem Header zugewiesen wird. Zum Beispiel:

$csh.USER_GROUP = $line.Substring(0,10).Trim() 
$csh.ORDER_NUMBER = $line.Substring(10,8).Trim()   
$csh.ORDER_ENTRY_DATE=$line.Substring(18,8).Trim() 
$csh.CONTACT_FIRST=$line.Substring(26,35).Trim() 
$csh.CONTACT_LAST=$line.Substring(61,35).Trim() 
$csh.CONTACT_TITLE=$line.Substring(96,35).Trim() 
$csh.CONTACT_EMAIL= $line.Substring(131,35).Trim() 
$csh.CONTACT_PHONE=$line.Substring(166,20).Trim() 
$csh.SCHOOL_ID=$line.Substring(186,15).Trim() 
} | convertto-csv | select-object -skip 1 | out-file temp.csv 

Jetzt, da es Leerzeichen und sich wiederholende Elemente gibt, ist es falsch, dass doppelte Schlüssel nicht erlaubt sind. Gibt es eine elegante Alternative?

+0

Warum Sie RegEx verwenden, wenn es feste Breite ist? Warum nicht einfach '$ Line.SubString()' verwenden, um die verschiedenen Spalten zu erhalten? Oder werden die Spaltenbreiten variieren? – TheMadTechnician

+0

die Spaltenbreiten variieren verrückt und lesen mindestens 4000 Zeilen. – skrubber

+0

Wie geht es mit: '$ Zeile -split" \ s {2} "|? {$ _} |% {$ _. Trim() -split '(\ d \ d \/\ d \ d \/\ d \ d) '-join', '} ' – TheMadTechnician

Antwort

1

Spiel mit zwei oder mehr Räume als Trennzeichen:

if ($Line -match '(\S.*?) +(.{6})(.{8})(.*?) +(.*?) +(.*?) +(.*)') { 
    $whatsit = $matches[1] 
    $index = $matches[2] 
    $date = $matches[3] 
    $name1 = $matches[4] 
    $name2 = $matches[5] 
    $position = $matches[6] 
    $place = $matches[7] 
} else { 
    echo "Bad line $Line" 
} 
+0

Es ist nicht klar, ob Sie weitere Hilfe benötigen, auch um Leerzeichen in Kommentaren zu erhalten, verwenden Sie Backticks um den Text herum: '\' Irgendein Text \ " – wOxxOm

+0

Ehrfürchtig. Hat funktioniert. Ich habe eine Zeile wie: 'ABC 12345607/24/16Joe Smith Head Trainer BUDDY'S Box 423542312.' (mit 4 Tabs im Wert von Leerraum vor dem letzten Element; und in der Tat sollte dieser Raum als ein anderes Element mit NULL gefüllt werden) Ich habe es versucht um einen zusätzlichen Platz vor dem + hinzuzufügen, aber hat nicht funktioniert – skrubber

+0

Wie Sie sehen können, funktionieren die Backticks nicht, wenn es einen Platz direkt nach dem Öffnen gibt, so dass ich die tatsächlichen Daten nicht sehen kann. Es ist auch nicht klar, warum es einen Nullpunkt geben sollte. Kannst du eine andere Linie zeigen, die etwas an diesem Ort hat? – wOxxOm