2017-07-14 89 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: ...//子始終顯示爲對,以相同的順序,你應該能夠用一個正則表達式來提取這兩個值。嘗試這樣的:

Get-ChildItem "D:\New folder\*.txt" | ForEach-Object { 
    $s = Get-Content $_.FullName 
    $ipo = [regex]::Matches($s,'(IPO .+?) -').Groups[1].Value 
    [regex]::Matches($s,' On (.+?),[\s\S]*?//TEST: (.+?)//') | ForEach-Object { 
     New-Object -Type PSObject -Property @{ 
      IPO = $ipo 
      Date = $_.Groups[1].Value 
      Test = $_.Groups[2].Value 
     } 
    } 
} | Export-Csv 'C:\path\to\output.csv' -NoType 
+0

這工作完美,我想我應該提到,甚至包括第二次約會。我可以更好地說句實話。 基本上,每個文本文件頂部都有一個唯一的IPO號碼。 每個文本文件都有多個TEST子字符串和多個日期/時間子字符串。因此,csv需要將每個測試和日期/時間包含在其各自的IPO –

+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" 
}