2016-07-25 3 views
0

Ich habe zahlreiche TXT-Dateien, die von einem handle.exe Lauf von mehreren Tagen ausgegeben werden. Ich muss die Daten reorganisieren, um sie in eine relationale Datenbank zu bekommen. Das erste, was ich tun muss, ist, die Daten neu zu formatieren.Re-formatieren Sie zahlreiche Daten (jeweils unterschiedlich) in TXT-Datei

Jede Datei hat mehr als 800 Daten, ungleich verteilt in der gesamten Datei. Die Daten sind formatiert:

June 29, 2016 12:05:45 PM und ich brauche 06-29-16 12:05:45.

Ich arbeite gerade an einer einzigen Datei, um die Dinge anzurufen. Ich habe versucht, die Daten in situ (unter Verwendung eines Arrays für die ursprünglichen Daten) mit Get-Date zu ersetzen und kam nirgendwohin. Dann habe ich versucht -replace und das hat nicht funktioniert.

Ich habe 3 oder 4 Tage damit verbracht und ich denke, ich habe meinen Kopf gebrochen. Ich habe so viele Permutationen von Sachen ausprobiert, von denen ich nicht einmal mehr weiß, wo ich bin.

Das letzte, was ich versuchte, war unten. Ein Versuch, eine Hashtabelle mit dem alten Datum und dem neuen Datum in der Tabelle zu verwenden.

##To set "|" as separator for arrays 
$OFS = '|' 

##To get original dates into array 
$a = @(sls .\hp.txt -pattern '(june 29|june 30|july 1|july 2|july 3|july 4)' | select -ExpandProperty line) 

##To get dates with corrected format into array 
$b = @($a | foreach {$_ | Get-Date -Format "MM-dd-yy hh:mm:ss"}) 

##To get old and new dates into hash table 
$dates = @{$a = $b} 

##To bring in content from file 
$file = (Get-Content C:\hp.txt) 

##To replace "NAME" with "VALUE" from hash table into file 
foreach ($d in $dates) { 
    $file = $file -replace $d.Name, $d.Value 
} 

##To save corrected file with new file name 
Set-Content -Path C:\hpnew.txt -Value $file 

Die $a Array enthält (in kleinen Teil):

June 29, 2016 12:04:51 PM 
June 29, 2016 12:05:58 PM 
June 29, 2016 12:07:00 PM 
[NOTE: LOTS MORE DATES HERE] 
June 30, 2016 12:01:17 AM 
June 30, 2016 12:02:19 AM 
June 30, 2016 12:04:22 AM 
[NOTE:CONTINUING TO END]

Die $b Array enthält:

06-29-16 12:04:51 
06-29-16 12:05:58 
06-29-16 12:07:00 
[NOTE: LOTS MORE DATES ] 
06-30-16 12:01:17 
06-30-16 12:02:19 
06-30-16 12:04:22 
[NOTE: CONTINUING TO END]

Es ist wahrscheinlich eine viel einfachere, elegantere Lösung. Aber jede Hilfe/Richtung wäre großartig.

+0

, wenn Sie können PS v5 installieren, könnten Sie versuchen - Convert-FromString http://www.powershellmagazine.com/2014/09/09/using-the-convertfrom-string-cmdlet-to-parse-structured-text/ – Kiran

+0

Kiran ... danke für den Tipp. Aber gibt es wirklich keine Möglichkeit, dies in 4.0 zu tun? Wird eine Hash-Tabelle nicht funktionieren? Es kommt mir so vor, als ob ich nah dran bin, aber ich kann einfach nicht den letzten Feinschliff machen, um das Ergebnis, das ich suche, rauszuschmeißen. – Charlie

Antwort

1

einen regulären Ausdruck Verwenden Sie die Datumszeichenfolgen aus dem Text zu extrahieren, übergeben Sie dann die Spiele auf eine Callback-Funktion, wo Sie parse sie tatsächlich DateTime Werte und format diejenigen nach Ihren Anforderungen:

$re = '((?:january|february|...|december) \d{1,2}, \d{4} \d{1,2}:\d{2}:\d{2} [ap]m)' 

$input_fmt = 'MMMM d, yyyy h:mm:ss tt' 
$output_fmt = 'MM-dd-yy HH:mm:ss' 
$culture = [Globalization.CultureInfo]::InvariantCulture 
$options = [Text.RegularExpressions.RegexOptions]::IgnoreCase 

$callback = { 
    [DateTime]::ParseExact($args[0].Groups[1].Value, $input_fmt, $culture).ToString($output_fmt) 
} 

$txt = Get-Content '.\hp.txt' -Raw 
[regex]::Replace($txt, $re, $callback, $options) | Set-Content '.\hpnew.txt' 
+0

Hmmm, wenn ich genau wie geschrieben gelaufen bin, bekomme ich den Fehler zurück, * "Ausnahme" ParseExact "mit" 3 "Argument (en):" String wurde nicht als gültige DateTime erkannt. "*" – Charlie

+0

Sie haben die Ellipse ersetzt ('...') in '$ re' mit den anderen Monatsnamen, getrennt durch Pipes (' | '), nicht wahr? –

+0

@ Ansgar ... NEIN! Hab ich nicht! LOL, meine Schuld ganz. Du meinst, jedes kleine Ding muss richtig auf diesen sein ?! [Witz] Es funktioniert perfekt. Danke danke danke! – Charlie

Verwandte Themen