作为我正在运行的脚本的延续,正在进行以下操作。
我有一个格式化信息的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 ...
如果Import.csv
中的行与Note.txt
中的任何一行匹配,我试图获取Note.txt
的内容以及Import.csv
中的每一行,然后复制该行加入CSV并附加。继续添加匹配的每个其他行。然后,这会在CSV的每一行上循环。
我需要找到最好的方法,不要多次导入CSV,因为它很大。
我得到的相反,我认为:
$Dir = PathToFile
$import = Import-Csv $Dir\import.csv
$NoteFile = "$Dir\Note.txt"
$Note = GC $NoteFile
$Name = (($Import.Name).Split("\"))[4]
foreach ($j in $import) {
foreach ($i in $Note) {
$j | where {$Name -eq "$i"} | Export-Csv "$Dir\Result.csv" -NoTypeInfo -Append
}
}
这需要太长时间,而且我没有得到我需要的提取。
答案 0 :(得分:1)
按区别特征对导入的数据进行分组,按名称过滤组,然后展开其余组并将数据写入输出文件:
Import-Csv "$Dir\import.csv" |
Group-Object { $_.Name.Split('\')[4] } |
Where-Object { $Note -contains $_.Name } |
Select-Object -Expand Group |
Export-Csv "$Dir\Result.csv" -NoType
答案 1 :(得分:1)
这需要太长时间,而且我没有得到我需要的提取。
这是因为您只在外部$name
循环之外分配foreach
一次,因此您基本上对CSV中的每一行执行相同的X比较。
我会使用Where-Object
运算符将嵌套循环重写为单个-contains
过滤器:
$Import |Where-Object {$Note -contains $_.Name.Split('\')[4]} |Export-Csv "$Dir\Result.csv" -NoTypeInformation -Append