Powershell:将两个CSV文件合并为部分重复的行

时间:2014-10-20 07:23:10

标签: powershell csv

我从网站上删除了两个文件,以便列出我所在城市的公司。 第一个列表:姓名,城市,电话号码,电子邮件 第二个列表:姓名,城市,电话号码

如果我将它们合并,我会有重复的行,例如,我将有以下内容:

> "Firm1";"Los Angeles";"000000";"info@firm1.lol"
> "Firm1";"Los Angeles";"000000";""
> "Firm2";"Los Angeles";"111111";""
> "Firm3";"Los Angeles";"000000";"contact@firm3.lol"
> "Firm3";"Los Angeles";"000000";""
> ...

有没有办法合并这两个文件并保留最大信息:

> "Firm1";"Los Angeles";"000000";"info@firm1.lol"
> "Firm2";"Los Angeles";"111111";""
> "Firm3";"Los Angeles";"000000";"contact@firm3.lol"
> ...

3 个答案:

答案 0 :(得分:0)

根据这个事实,你有一个名为'firm.csv'的文件

"Firm1";"Los Angeles";"000000";"info@firm1.lol"
"Firm1";"Los Angeles";"000000";""
"Firm2";"Los Angeles";"111111";""
"Firm3";"Los Angeles";"000000";"contact@firm3.lol"
"Firm3";"Los Angeles";"000000";""

您可以使用以下方式加载它:

$firms = import-csv C:\temp\firm.csv -Header 'Firm','Town','Tel','Mail' -Delimiter ';'

然后

$firms | Sort-Object -Unique -Property 'Firm'

根据Joey的评论,我改进了解决方案:

$firms |  Group-Object -Property 'firm' | % {$_.group | Sort-Object -Property mail -Descending | Select-Object -first 1}

答案 1 :(得分:0)

必须有更好的方法,但这是一种很好的方法来做到这一点。

$firms = import-csv C:\firm.csv -Header 'Firm','Town','Tel','Mail' -Delimiter ';'

$Result = @()
ForEach($i in $firms){

   $found = 0;

   ForEach($m in $Result){

    if($m.Firm -eq $i.Firm){

        $found = 1

        if( $i.Mail.length -ne 0 )
        {   
           $m.Mail = $i.Mail
        }
        break;
      }
   }

   if($found -eq 0){
        $Result += [pscustomobject] @{Firm=$i.Firm; Town=$i.Town; Tel=$i.Tel; Mail=$i.Mail}
   }
}

$Result | export-csv C:\out.csv

答案 2 :(得分:0)

编辑:刚刚意识到这两个文件不包含相同的标题。这是一个更新。

$main = Import-Csv firm1.csv -Header 'Firm','Town','Tel','Mail' -Delimiter ";"
$alt = Import-Csv firm2.csv -Header 'Firm','Town','Tel' -Delimiter ";" 

foreach ($f in $alt)
{
    $found = $false
    foreach($g in $main)
    {
        if ($g.Firm -eq $f.Firm -and $g.city -eq $f.city) 
        {
            $found = $true

            if ($g.Tel -eq "")
            {
                $g.Tel = $f.Tel
            }
        }
    }
    if ($found -eq $false)
    {
        $main += $f
    }
}


# Everything is merged into the $main array 
$main