2016-07-25 5 views
0

handle.exeから出力される数多くの.txtファイルが数日間あります。私はそれをリレーショナルデータベースに取得するためにデータを再編成する必要があります。私が最初にやるべきことは、日付を再フォーマットすることです。.txtファイルに多数の日付を再フォーマットする(それぞれ異なる)

各ファイルの日付は800を超えており、ファイル全体に不均一に分散しています。日付は

June 29, 2016 12:05:45 PMとなり、06-29-16 12:05:45が必要です。

私はちょうど1つのファイルで作業しています。ダイヤルインを行うために、元の日付の配列を使用して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

、あなたの要件に応じて、あなたの実際のDateTime値にparseそれらをして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

Hmmm、私はちょうど書かれたように実行すると、 "3"引数を持つ "ParseExact"を呼び出す例外: "文字列が有効なDateTimeとして認識されませんでした" * " – Charlie

+0

省略記号'$ re'の中でパイプで区切られた月の名前(' | ')ではなく(' ... ')、それはあなたですか? –

+0

@Ansgar ... NO!私はしませんでした! LOL、私のせいで完全に。あなたはすべて、小さなことがこれらに正しいことを意味しますか? [冗談]それは完全に動作します。ありがとう、ありがとう、ありがとう! – Charlie

関連する問題