2017-07-05 10 views
0

テキストファイルからデータを読み込み、CSVを生成する必要があります。テキストファイルのデータを8回分割して、個々の行にCSVを入力する

私は正規表現がhereをテストすることができ

$PAGE = Get-Content .\DATA.txt | ForEach-Object { 
    New-Object PSObject -Property @{ 
     FIELD1 = [regex]::Matches($_, '^[^\:]*[^\.txt:]').Value 
     FIELD2 = [regex]::Match($_, 'DATA').Value 
     FIELD3 = [regex]::Match($_, 'DATA\s(.+)').Value 
     FIELD4 = [regex]::Match($_, 'DATA\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s') 
    } 
} 

$PAGE | Select-Object FIELD1, FIELD2, FIELD3, FIELD4 | 
    Export-Csv DATA.csv -NoTypeInformation 

データを取得するには、このPowerShellスクリプトを使用しています。サンプル入力:指定されたデータに対して上記のスクリプトの

 
file1.txt: DATA 46546 TEST1 EUIRWY 283746827 2 1 3 3 
file2.txt: DATA 96873 TEST2 KJH-ASKDJH 928374 0 0 0 0 

出力は、このように来ている:

 
FIELD1 | FIELD2 | FIELD3          | FIELD4 
file1 | DATA | DATA 46546 TEST1 EUIRWY 283746827 2 1 3 3 | FIELD4 
file2 | DATA | DATA 96873 TEST2 KJH-ASKDJH 928374 0 0 0 0 | FIELD4 

しかし、意図された出力は、このです。

 
FIELD1 | FIELD2 | FIELD3 | FIELD4 
file1 | DATA | D1  | 46546 
file1 | DATA | D2  | TEST1 
file1 | DATA | D3  | EUIRWY 
file1 | DATA | D4  | 283746827 
file1 | DATA | D5  | 2 
file1 | DATA | D6  | 1 
file1 | DATA | D7  | 3 
file1 | DATA | D8  | 3 
file2 | DATA | D1  | 96873 
................................ 
................................ 
..............and so no 8 times 

基本的にフィールド4は常にFIELD1はFIELD2があまりにも「DATA」とFIELD3は常にこのシーケンスD1に続く8回に表示されます8回ファイルの名前でなければなりません8つの文字列または数字を持っています.... D8 。 DATA.TXTファイルのすべての行について同じことを繰り返します。だからサンプルで私はfile1.txtとfile2.txtとして2行を取っている。

私はどのように進めるべきか考えることができません。私がスクリプトの中で同様のアプローチを使用したいのは、それが私の主要なスクリプトの一部であり、一貫性のために私は可能ならばこのアプローチを使いたいと思うからです。

+0

サンプル入力してください。 –

+0

@Ansgar Wiechersテスト文字列はすでに存在しています。[link](https://regex101.com/r/Ip9RBW/1) – n00b

+0

あなたの質問に関連するすべてのものを入力してください。私はあなたの質問に答えることができるように他の場所に行く気がするよりも多少少ないです。 –

答えて

1

私はWhere-Objectフィルタで試合を行い、ForEach-Object内にネストforループ内で必要なオブジェクトを構築します:

$re = '^(.*?\.txt):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$' 
$PAGE = Get-Content .\DATA.txt | Where-Object { 
    $_ -match $re 
} | ForEach-Object { 
    for ($i=3; $i -lt $matches.Count; $i++) { 
     New-Object PSObject -Property @{ 
      FIELD1 = $matches[1] 
      FIELD2 = $matches[2] 
      FIELD3 = "D$($i-2))" 
      FIELD4 = $matches[$i] 
     } 
    } 
} 
関連する問題