解析文本行并与CSV

时间:2017-03-07 22:57:00

标签: powershell csv

作为我正在运行的脚本的延续,正在进行以下操作。

我有一个格式化信息的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
  }
}

这需要太长时间,而且我没有得到我需要的提取。

2 个答案:

答案 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