2016-07-25 58 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