2017-07-14 10 views
1

私は以下のような内容のファイルでいっぱいのディレクトリを持っています。 //TEST:の後、//の前にすべてをコピーしたいので、日時とIPOをCSVにコピーします。複数のテキストファイルのデータをCSVに解析する

 
IPO 7 604 1148 17 - Psuedo text here doesnt mean anything just filler text, beep, boop.txt 


werqwerwqerw 
erqwerwqer 
2. (test) On 7 July 2017 at 0600Z, wqerwqerwqerwerwqerqwerwqjeroisduhsuf //TEST: 37MGUI2974027//, 
sdfajsfjiosauf 
sadfu 
(test2) On 7 July 2017 at 0600Z, blah blah //TEST: 89MTU34782374// 
blah blah text here //TEST: GHO394749374// (this is uneeded) 

さて、各ファイルは、このデータの複数のインスタンスを持っており、それらの何百ものがあるかもしれません。

私はそれがこれに似たCSVに出力したい:私は成功し、次にすることをを作成している、と私は正しい軌道に乗ってるように私は感じ

 
89MTU34782374, 3 July 2016 at 0640Z, IPO 7 604 1148 17 

$x = "D:\New folder\" 
$s = Get-Content $x 
$ipo = [regex]::Match($s,'IPO([^/)]+?) -').Groups[1].Value 
$test = [regex]::Matches($s,'//TEST: ([^/)]+?)//').Groups[1].Value 
$date = [regex]::Matches($s,' On([^/)]+?),').Groups[1].Value 
Write-Host $test"," $date"," IPO $ipo 

しかし、ファイル内のすべてのインスタンスを見つけて選択し、新しい行に印刷することができません。私はまた、それがデータを探している方法、すべてのテキストファイルは、このようにフォーマットされていることに注意する必要があります。

テキストドキュメント内の各文字列/変数を新しい行に印刷することに問題があるだけでなく、複数のファイルに対して行う方法を理解するのに問題があります。

私は次のことを試してみましたが、それは最初のファイルから探している用語を見つけるように見える、とのように多くのファイルのためにそれを吐き出しがディレクトリに含まれています

$files = Get-ChildItem "D:\New folder\*.txt" 
$s = Get-Content $files 
for ($i=0; $i -lt $files.Count; $i++) { 
    $ipo = [regex]::Match($s,'IPO([^/)]+?) -').Groups[1].Value 
    $test = [regex]::Matches($s,'//TEST: ([^/)]+?)//').Groups[1].Value 
    $date = [regex]::Matches($s,' On([^/)]+?),').Groups[1].Value 
    Write-Host $test"," $date"," IPO $ipo 
} 

誰もがいずれかを持っていますこれがどうやって行えるかについてのアイデア?

私はこれを説明するのに悪い仕事をしました。 すべての文書にIPO番号があります。 すべてのTEST文字列には日付/時刻が関連付けられています。 他のTEST文字列があるかもしれませんが、それらは無視することができ、日付/時刻なしでは読み込まれません。彼らが製品に含まれていれば、私はそれを簡単にきれいにすることができます。 すべてのTEST +日付/時刻コンボには、元のIPO番号が含まれている必要があります

答えて

2

日付と//TEST: ...//ストリングの場合は、常にペアとして表示され、同じ順序で、あなたは、単一の正規表現との両方の値を抽出することができるはずです。

+0

これは完全にうまくいきました。私は言及すべきであったはずだと思いますが、2番目の日付も含めてください。私はすべて正直であるように言い表すことができました。 基本的に、すべてのテキストファイルの一番上に一意のIPO番号があります。 すべてのテキストファイルには、複数のTEST部分文字列と複数の日付/時刻部分文字列があります。したがって、csvはそれぞれのIPOと同じ行にすべてのTESTと日付/時刻を含める必要があります –

+0

どのようにこれらの複数の日付とTEST部分文字列を互いに関連付ける必要がありますか? –

+0

さて、このコメントは物事をひどくフォーマットします。基本的には、TESTと日付/時刻が一緒になることを望んでいます。彼らは文書の中に登場するとき、互いに「合っている」。 IPO番号は、それが特定のものではありません –

1

ようですか?私があなたの質問を理解すれば、あなたのコードの大部分はうまくいくようです。

見つかったファイルの数について同じことを繰り返すが、実際には個々のファイルを参照していないので、ループが間違っているようです。また、各ファイルの内容を取得するには、$s = ...がループ内にある必要があります。

$files = Get-ChildItem "D:\New folder\*.txt" 
foreach($file in $files){ 
    $s = Get-content $file 
    $ipo = [regex]::Match($s,'IPO([^/)]+?) -').Groups[1].Value 
    $test = [regex]::Matches($s,'//TEST: ([^/)]+?)//').Groups[1].Value 
    $date = [regex]::Matches($s,' On([^/)]+?),').Groups[1].Value 
    Write-Host "$test, $date, IPO $ipo" 
} 
関連する問題