2017-09-07 17 views
0

私はCSVにエクスポートしたい複数の大きなログファイルを持っています。まず、日付とイベントの2つの部分を分割したいだけです。私が持っている問題は、すべての行が日付で始まるわけではないということです。複数行のテキストをpowershellで解析し、csvにエクスポート

ここにはログのサンプルチャンクがあります。日付/時刻は常に23文字です。残りは、ログとイベントの説明によって異なります。

enter image description here

私はExcelでこのように見えるように最終的な結果をしたいと思います。

enter image description here

ここで私はこれまで試したものですが、ただ、各行の最初の23個の文字を返します。

$content = Get-Content myfile.log -TotalCount 50 
for($i = 0; $i -lt $content.Length; $i++) { 
$a = $content[$i].ToCharArray() 
$b = ([string]$a[0..23]).replace(" ","") 
Write-Host $b } 
+2

あなたはテキストでログの一部を投稿できるので、私は何か – ArcSet

+0

2017年9月4日12試すことができますしてください:31:11.343 \t一般\t BOECD :: PROCESSSTARTTIME: ワード:長さ3 [0917 1204 3029] ヘックスを:長さ6 [17 09 04 12 29 30] 。 \tディスプレイ:偽\t 2017年9月4日12:31:11.479 \t一般\t MelsecIoWrapper:スキャンが終了:デバイス:1、ScanStart:2017年9月4日12時31分10秒PM \tディスプレイ:偽\t 2017から09を-04 12:31:11.705 \t一般\t BOECD :: ProcessEndTime: 語長:3 0917 1204 0931 16進数:17 09 04 12 31 09 。 \tディスプレイ:偽\t 2017年9月4日12:31:13.082 \t一般\t BOECD :: DVデータ: –

+0

注:実際のログファイルでは、日付は常に上の写真のような行を開始します。私はサンプルを貼り付けたときに、すべてをまとめました。 –

答えて

2

複数行の文字列として生でファイルを読み、日付パターンに分割するために正規表現を使用し、各チャンクのための最初の値は、あなたがしたい2つのプロパティを持つカスタムオブジェクトを作ります最初の23文字、2番目の値はトリミングされた残りの文字列です。

(Get-Content C:\Path\To\File.csv -Raw) -split '(?m)(?=^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})'| 
    Where{$_}| 
    ForEach-Object{ 
     [PSCustomObject]@{ 
      'Col1'=$_.Substring(0,23) 
      'Col2'=$_.Substring(23).Trim() 
     } 
    } 

次に、そのデータをCSVにパイプするか、データで必要なものを実行できます。ファイルが本当に大量である場合、これは実行可能ではないかもしれませんが、私は考えると数百メグまでファイル上で正常に動作するはずです。あなたのサンプルテキストを使用して出力することを:それは画面に表示するために、複数行の値を切り捨てどこ二行の末尾に

 
Col1     Col2 
----     ---- 
2017-09-04 12:31:11.343 General BOECD:: ProcessStartTime: ... 
2017-09-04 12:31:11.479 General MelsecIoWrapper: Scan ended: device: 1, ScanStart: 9/4/2017 12:31:10 PM Display: False 
2017-09-04 12:31:11.705 General BOECD:: ProcessEndTime: ... 
2017-09-04 12:31:13.082 General BOECD:: DV Data: 

...がありますが、値はそのままそこにあります。

(?=...)は、いわゆる「正の先読みアサーション」です。そのようなアサーションは、返されたマッチ/文字列に正規表現を実際に含めずに、正規表現を与えられたパターンにマッチさせます。この場合、タイムスタンプの前に空の文字列が返されるため、タイムスタンプを削除せずに文字列を分割することができます。

+1

私は、 '(?m)(?=^\ d {4} -...)'というパターンを作成して、行頭のタイムスタンプを具体的に照合します。ハイフンとコロンはエスケープする必要はありません。 –

+1

ありがとうございます、私はRegExのすべての文字を予約文字として覚えていますので、時々過脱字する傾向があります。私はまた、ラインの始めに日付/時刻を取得するというあなたの提案を反映するための答えを更新しました。これは素晴らしいアイデアです。 – TheMadTechnician

関連する問題