2016-07-25 43 views
0

我有幾天的handle.exe運行輸出的衆多.txt文件。我需要重新組織數據以將其存入關係數據庫。我需要做的第一件事就是重新格式化日期。在.txt文件中重新格式化多個日期(每個不同)

每個文件有超過800個日期,分佈在整個文件不均勻。日期格式:

June 29, 2016 12:05:45 PM和我需要06-29-16 12:05:45

我現在只是在處理單個文件,以便撥打電話。我試圖用Get-Date原位替換日期(使用原始日期的數組),並且無處可用。然後我嘗試-replace,那沒有奏效。

我已經花了3到4天的時間,我想我已經傷了腦筋。我已經嘗試了很多東西排列,我甚至不知道我現在在哪裏。

我試過的最後一件事是在下面。嘗試使用散列表,在表中使用舊日期和新日期。

##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 

$a數組包含(小部分):

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]

$b數組包含:

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]

有可能是一個更簡單,更優雅的解決方案。但任何幫助/方向都會很棒。

+0

,如果你能安裝PS v5你可以嘗試 - Convert-FromString http://www.powershellmagazine.com/2014/09/09/using-the-convertfrom-string-cmdlet-to-parse-structured-text/ – Kiran

+0

Kiran ...謝謝爲小費。但在4.0中真的沒有辦法做到這一點?散列表是否不起作用?看起來好像我接近了,但我無法做出最後的調整來讓它發揮我尋求的結果。 – Charlie

回答

1

使用正則表達式從文本中提取的日期字符串,然後通過比賽來一個回調函數,你parse他們實際DateTime價值觀和format那些根據您的要求:

$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

嗯,當我運行的時候就像我寫回的錯誤一樣,*「異常調用」ParseExact「帶有」3「參數:」字符串未被識別爲有效的日期時間。「*」 – Charlie

+0

您確實替換了省略號('...')放在'$ re'中,其他月份名稱由管道分隔('|'),不是嗎? –

+0

@Ansgar ...不!我沒有!哈哈,完全是我的錯。你的意思是,每件事都必須正確對待這些? [笑話]它完美的作品。謝謝你,謝謝你,謝謝你! – Charlie