2017-06-15 36 views
2

さまざまなログファイルからデータを読み込んで、powershellを使用してデータをcsvに入れるスクリプトを作成する必要があります。出力csvはログファイルの名前として最初の列を持ち、2番目の列はログファイルの特定の内容を持つ必要があります。2番目の列の内容は同じファイルから2回発生しません。ログファイル名。私は両方のタイプのデータを抽出することができましたが、スクリプトは結果をcsvに入れる前に正規表現パターンを使った最初の一致にのみ一致します。PowerShellのRegexは、最初に一致した行と一致します

私は次のスクリプト使用しています:私のスクリプトで

$test = gc .\datalog.txt | Select-String -Pattern '"\w:\\\w+\\' -NotMatch | 
ForEach-Object { 
New-Object psobject -Property @{ 
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]') 
D_name = [regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])').Groups[1].value 
    } 
} 
$test | Select-Object D_no, D_name | Export-Csv abc.csv -NoTypeInformation 

D_nameは私の意図する動作がD_nameで正規表現を使用してすべてのエントリを捕獲することであるとして、行の最初の試合に一致します。しかし、私は

Select-String -allmatches '^[^\:]*[^\.log:]|(?!\\)\w+\S+(?=\\)|(\w:\w+)[^"]').Matches.Value 

を使用していたときに正規表現が正常に動作しているが、これは私にD_noとD_nameの両方のための1つの列のデータを与えます。 The sample data can be found here

答えて

1

D_nameの場合、1つのマッチグループ(Groups[1].value)のみを抽出しています。これが期待される結果です。一致するすべての結果をD_nameに入力し、CSVに正しくエクスポートするには、それらを組み合わせて文字列にする必要があります。たとえば、次のようにD_noのための最初の式からあなたもMatchCollectionを得るが、1つだけの要素を含むことを

New-Object psobject -Property @{ 
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]').Value 
D_name = ([regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])') | foreach {$_.Value}) -join ',' 
} 

注意してください。私はそれからValueプロパティを取得することをお勧めします。

+0

今、D_nameの値は、各セルの個別の値ではなく、1行に入っています – n00b

+0

最初に、あなたの質問で「2番目の列の内容」と言っていました。そうですか?次に、export-csvは任意の数の列をサポートしていません。パイプの最初のオブジェクトをチェックし、それ以外のすべてのオブジェクトのプロパティのみをインクルードします。一致する文字列をカンマで区切ってファイルに書き出すことでexport-csvをシミュレートできます(実際にはCSV形式) –

関連する問題