2017-07-14 59 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" 
}