作为我正在运行的脚本的延续,正在进行以下操作。
我有一个格式化信息的CSV文件,例如:
名为Import.csv的文件:
Name,email,x,y,z
\I\RS\T\Name1\c\x,email@jksjks,d,f
\I\RS\T\Name2\d\f,email@jsshjs,d,f
...
此文件很大。
我还有一个名为Note.txt的文件。
Name1
Name2
Name3
...
在@ mathias-r-jessen
的帮助下$Dir = PathToFile
$import = Import-Csv $Dir\import.csv
$NoteFile = "$Dir\Note.txt"
$Note = GC $NoteFile
$Import |Where-Object {$Note -contains $_.Name.Split('\')[4]} |Export-Csv "$Dir\Result.csv" -NoTypeInformation -Append
此代码快速,轻松地解析大csv并提取包含$ note文件中任何行的每一行。
我的下一个问题是如何记录$ note文件中csv文件中找不到的任何行。
我尝试了以下内容:
$result = $Import |Where-Object {$Note -contains $_.Name.Split('\')[4]} |Export-Csv "$Dir\Result.csv" -NoTypeInformation -Append
$Note | Where-Object {$result.Name.Split('\')[4] -notcontains $Note} | out-file $dir\not-found.log -append
这似乎返回$ note中的每一行。
@ mathias-r-jessen您可以提供任何帮助。
答案 0 :(得分:1)
您可以使用Switch
来执行此操作。
Switch($Import){
{$Note -contains $_.Name.Split('\')[4]} {$_ | Export-Csv "$Dir\Result.csv" -NoTypeInformation -Append; continue}
default {$_ | Export-csv "$Dir\Not-Found.csv" -NoType -Append}
}
第一个选项中的continue
使得如果第一个案例匹配则执行相关操作,然后继续下一个记录。如果第一种情况不匹配,则会转到默认操作,然后将其输出到另一个文件。
答案 1 :(得分:0)
我使用以下方法解决了这个问题:
$result = $Import |Where-Object {$Note -contains $_.Name.Split('\')[4]}
$result | Export-Csv "$Dir\Result.csv" -NoTypeInformation -Append
$matches = $note | where-object { $result.Name -match $_}
compare-object $note $matches |where-object {$_.SideIndicator -like "<=" | select -ExpandProperty InputObject | Out-file "$Dir\Not_found.txt" -Append