Regex 将文本文件中的数据拆分8次,以将CSV放入各行中
我需要从文本文件中读取一些数据并生成CSV 我正在使用此PowerShell脚本获取数据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
$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]
}
}
}