Powershell搜索2列csv并返回匹配的匹配项

时间:2017-07-22 20:54:43

标签: arrays powershell csv search text

这是我的困境。我有一个带有两列的csv文件

ID,FullFileName  
1,Value1  
1,Value2  
1,Value3  
2,Value1  
2,Value2  
3,Value1  
4,Value1  
5,Value1  
5,Value2  

我要查找的输出是获取导出的csv,其中包含两列ID和FullFilename。 FullFileName中的值将包含由管道分隔符分隔的匹配连接值。

但我的输出我试图获得以下内容:

ID,FullFilename  
1,Value1|Value2|Value3  
2,Value1|Value2  
3,Value1  
4,Value1  
5,Value1|Value2  

我不确定如何让powershell搜索ID中的值并获取所有结果并将它们转换为具有管道分隔的单个连接值。任何有关尝试搜索数组或连接/连接数组值的帮助都将非常感激。

3 个答案:

答案 0 :(得分:2)

Group-Object是可以帮助您的有用cmdlet。按ID对数据进行分组将其转换为:

PS D:\> ipcsv .\t.csv | group id

Count Name Group
----- ---- -----
    3 1    {@{ID=1; FullFileName=Value1}, @{ID=1; FullFileName=Value2}, @{ID=1; FullFileName=Value3}}
    2 2    {@{ID=2; FullFileName=Value1}, @{ID=2; FullFileName=Value2}}
    1 3    {@{ID=3; FullFileName=Value1}}
    1 4    {@{ID=4; FullFileName=Value1}}
    2 5    {@{ID=5; FullFileName=Value1}, @{ID=5; FullFileName=Value2}}

所以你想要名字(= ID)和Group属性,只有FullFileName,加入:

Import-Csv -Path c:\path\data.csv | 
    Group-Object -Property ID | 
    Select-Object @{Name='ID'; Expression={$_.Name}},
                  @{Name='FullFilename'; Expression={$_.Group.FullFileName -join '|'}} | 
    Export-Csv -Path C:\Path\out.csv -NoTypeInformation

答案 1 :(得分:0)

$InFile = '.\Sample.csv'
$OutFile= '.\New.csv'
$Csv = Import-Csv $InFile | Group-Object ID | ForEach-Object{
    [pscustomobject]@{
        ID=$_.Name
        FullFileName=$_.Group.FullFileName -join '|'
    }
} 
$Csv
"----------"
$Csv | Export-Csv $OutFile -NoTypeInformation
Get-Content $OutFile

示例输出:

ID FullFileName
-- ------------
1  Value1|Value2|Value3
2  Value1|Value2
3  Value1
4  Value1
5  Value1|Value2
----------
"ID","FullFileName"
"1","Value1|Value2|Value3"
"2","Value1|Value2"
"3","Value1"
"4","Value1"
"5","Value1|Value2"

编辑刚看到您想要将管道作为分隔符。

答案 2 :(得分:0)

尽我所能但是迟到了,无论如何这里是代码

我使用HashTable而不是Group-Object,当我的数据来自多个来源时,我觉得很容易使用。

$CSV = Import-Csv -Delimiter ',' -Path "$env:TEMP\testfolder\csv.txt" #can be .csv or whatever.
$HastTable = @{}

Foreach ($Line in $CSV) {
    if (!$HastTable["$($Line.ID)"]) {
        $HastTable["$($Line.ID)"] = $Line
    } 

    else {
        $HastTable["$($Line.ID)"].FullFileName += "|$($Line.FullFileName)"
    }
}

$HastTable.Values | Export-Csv -Delimiter ',' -NoTypeInformation -Path "$env:TEMP\testfolder\newcsv.txt" #can be .csv or whatever.