这是我的困境。我有一个带有两列的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中的值并获取所有结果并将它们转换为具有管道分隔的单个连接值。任何有关尝试搜索数组或连接/连接数组值的帮助都将非常感激。
答案 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.