将多个文本文件中的数据解析为CSV

时间:2017-07-14 12:17:01

标签: windows powershell

我的目录中充满了类似于以下内容的文件。我希望在//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编号

2 个答案:

答案 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"
}