我是Powershell的新手,我正在尝试根据特定列和另一个包含正则表达式和相关值列表的CSV文件向csv文件添加一列。
我可以在阅读许多关于 Import-csv 和 Select-Object 的帖子时进行一些改进。
第一个匹配值应用于填充新列,在此方案中名为"首选项"。
输入
数据.csv
id name first_name
-- ---- ----------
35 ALPHA UNIFORM
48 BRAVO VICTOR
39 CHARLIE WHISKEY
42 DELTA X-RAY
59 ECHO YANKEE
64 FOXTROT ZULU
正则表达式.csv
regex_key preference
--------- -----
LP MUSIC
VO VSOP
CH CHORIZO
.* OTHER
带有单个正则表达式的输出:正常
first_attempt.ps1
$single_preference = Import-Csv .data.csv |`
Select-Object *,
@{Name='preference';
Expression={if($_.name -match "CH"){"CHORIZO"} else {"OTHER"}}
} |`
Export-Csv -Path ".first_attempt_output.csv" -NoTypeInformation
first_attempt_output.csv
id name first_name preference
-- ---- ---------- ----------
35 ALPHA UNIFORM OTHER
48 BRAVO VICTOR OTHER
39 CHARLIE WHISKEY CHORIZO
42 DELTA X-RAY OTHER
59 ECHO YANKEE CHORIZO
64 FOXTROT ZULU OTHER
使用多个正则表达式的输出:卡住
expected_result.txt
id name first_name preference
-- ---- ---------- ----------
35 ALPHA UNIFORM MUSIC
48 BRAVO VICTOR VSOP
39 CHARLIE WHISKEY CHORIZO
42 DELTA X-RAY OTHER
59 ECHO YANKEE CHORIZO
64 FOXTROT ZULU OTHER
如何修改上面的代码以便能够迭代regex_keys并获得预期的结果?
非常感谢您的帮助。
我会使用foreach
遍历模式(不使用Foreach-Object
不覆盖$_
但您可以修改以匹配您的偏好(:
$data = Import-Csv .data.csv -Delimiter ';'
$patterns = Import-Csv .regex.csv -Delimiter ';'
$data | Select-Object *,@{Name='preference';Expression={
foreach ($p in $patterns) {
if ($_.name -match $p.'regex_key') {
$p.preference
break
}
}
}}
在if
中,如果检测到任何匹配,我使用break
来停止循环执行。