我的目录中充满了类似于以下内容的文件。我希望在//TEST:
之后和//
之前复制所有内容,我想将日期和时间以及IPO复制到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编号
答案 0 :(得分: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
答案 1 :(得分: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"
}