数据提取使用正则expression式
嗨,我有一个格式的文件
[stuff not needed]Type:A1[stuff not needed] [stuff not needed]Name:B1[stuff not needed] Row:Sampletext Row:Sampletext [stuff not needed]Type:A2[stuff not needed] [stuff not needed]Name:B2[stuff not needed] Row:Sampletext2 Row:Sampletext2 Row:Sampletext2
我在PowerShell中使用正则expression式来提取数据。
我正在使用像Regex1|Regex2|Regex3
,并将输出保存到文件。
输出格式为:
A1 B1 Sampletext Sampletext A2 B2 Sampletext2 Sampletext2 Sampletext2
我想要的格式
A1 B1 Sampletext A1 B1 Sampletext A2 B2 Sampletext2 A2 B2 Sampletext2 A2 B2 Sampletext2
我是PowerShell的新手,有什么办法可以做到这一点?
这是我的确切代码:
$input_path = 'idx.txt' $output_file = 'output.txt' $regex = 'Type:\s([A-Za-z]*)|Name:\s\s([A-Za-z]*)|[A-Za-z][a-z0-9A-Z_]*(?:\s*[0-6]\s*[0-4]\s\s[\s\d]\d\s*0)' select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file
数据太大,无法在这里发布,但不好的只是创build一个示例数据集。但正则expression式正在工作,可能是粗糙的,但它捕获所需的数据。 为了这个例子,我们可以把Type:([A-Za-z] )| Name:([A-Za-z] )| Row:([A-Za-z] *)作为正则expression式
检查每一行是否有type
或name
,只设置相应的variables,但是如果它有row
输出types和名称variables以及当前行内容。
$allmatches = Select-String '(Type|Name|Row):\s*(\w*)' $input_path -allmatches $output = foreach ($m in $allmatches) { $data = $m.Matches.Groups[2].Value switch ($m.Matches.Groups[1].Value) { 'Type' { $type = $data; break } 'Name' { $name = $data; break } 'Row' { "$type $name $data" } } } $output | Set-Content $output_path -Encoding UTF8
笔记:
- 我们使用更快的
foreach
expression式,而不是通过使用带有脚本块的foreach进行更慢的stream水线操作。 -
\w
正则expression式中的\w
表示任何单词字符,包括a-zA-Z0-9和_以及更多 - 在PowerShell中默认情况下,正则expression式匹配和string比较是敏感的