在.txt文件

时间:2016-07-25 16:11:00

标签: powershell powershell-v4.0

我有很多.txt文件,这些文件是从几天的handle.exe运行输出的。我需要重新组织数据以使其进入关系数据库。我需要做的第一件事是重新格式化日期。

每个文件都有超过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]

可能有更简单,更优雅的解决方案。但任何帮助/方向都会很棒。

1 个答案:

答案 0 :(得分: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'