Regex 将文本文件中的数据拆分8次,以将CSV放入各行中

Regex 将文本文件中的数据拆分8次,以将CSV放入各行中,regex,powershell,csv,Regex,Powershell,Csv,我需要从文本文件中读取一些数据并生成CSV 我正在使用此PowerShell脚本获取数据 $PAGE = Get-Content .\DATA.txt | ForEach-Object { New-Object PSObject -Property @{ FIELD1 = [regex]::Matches($_, '^[^\:]*[^\.txt:]').Value FIELD2 = [regex]::Match($_, 'DATA').Value

我需要从文本文件中读取一些数据并生成CSV

我正在使用此PowerShell脚本获取数据

$PAGE = Get-Content .\DATA.txt | ForEach-Object {
     New-Object PSObject -Property @{
         FIELD1 = [regex]::Matches($_, '^[^\:]*[^\.txt:]').Value
         FIELD2 = [regex]::Match($_, 'DATA').Value
         FIELD3 = [regex]::Match($_, 'DATA\s(.+)').Value
         FIELD4  = [regex]::Match($_, 'DATA\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s')
     }
}

$PAGE | Select-Object FIELD1, FIELD2, FIELD3, FIELD4 |
    Export-Csv DATA.csv -NoTypeInformation
正则表达式可以测试。样本输入:

file1.txt: DATA 46546 TEST1 EUIRWY 283746827 2 1 3 3 file2.txt: DATA 96873 TEST2 KJH-ASKDJH 928374 0 0 0 0 上述脚本对给定数据的输出如下:

FIELD1 | FIELD2 | FIELD3 | FIELD4 file1 | DATA | DATA 46546 TEST1 EUIRWY 283746827 2 1 3 3 | FIELD4 file2 | DATA | DATA 96873 TEST2 KJH-ASKDJH 928374 0 0 0 0 | FIELD4 但预期的产出是这样的

FIELD1 | FIELD2 | FIELD3 | FIELD4 file1 | DATA | D1 | 46546 file1 | DATA | D2 | TEST1 file1 | DATA | D3 | EUIRWY file1 | DATA | D4 | 283746827 file1 | DATA | D5 | 2 file1 | DATA | D6 | 1 file1 | DATA | D7 | 3 file1 | DATA | D8 | 3 file2 | DATA | D1 | 96873 ................................ ................................ ..............and so no 8 times 基本上,字段4总是有8个字符串或数字。字段1应该是文件名的8倍。字段2也将出现8倍于“数据”,字段3将始终遵循此顺序D1…D8。DATA.TXT文件中的每一行都要重复相同的操作。所以在示例中,我选取了两行作为file1.txt和file2.txt

我想不出我该怎么做。由于我想在脚本中使用类似的方法,因为它是我主脚本的一部分,为了统一性,如果可能的话,我想使用这种方法。

我会在Where对象过滤器中进行匹配,并在ForEach对象内嵌套的for循环中构造所需的对象:


请提供示例输入。@Ansgar Wiechers测试字符串已经存在。请提供与您的问题相关的所有内容。我不太想去别的地方只是为了回答你的问题。
$re = '^(.*?\.txt):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$'
$PAGE = Get-Content .\DATA.txt | Where-Object {
    $_ -match $re
} | ForEach-Object {
    for ($i=3; $i -lt $matches.Count; $i++) {
        New-Object PSObject -Property @{
            FIELD1 = $matches[1]
            FIELD2 = $matches[2]
            FIELD3 = "D$($i-2))"
            FIELD4 = $matches[$i]
        }
    }
}