两个CSV文件之间的特定匹配

时间:2019-02-10 11:59:07

标签: powershell csv match

我有两个这样的CSV文件:

CSV1:

Name
test;
test & example;
test & example & testagain;

CSV2:

Name
test1;
test&example;
test & example&testagain;

我想将CSV1的每一行与CSV2的每一行进行比较,如果前5个字母匹配,则写入结果。

我可以比较它们,但前提是完全匹配:

$CSV1 = Import-Csv -Path ".\client.csv" -Delimiter ";"
$CSV2 = Import-Csv ".\client1.csv" -Delimiter ";"

foreach ($record in $CSV1) {
    $result = $CSV2 | Where {$_.name -like $record.name}
    $result
}

2 个答案:

答案 0 :(得分:2)

您可以使用Compare-Object和自定义属性定义来实现。

Compare-Object $CSV1 $CSV2 -Property {$_.name -replace '^(.{5}).*', '$1'} -PassThru

$_.name -replace '^(.{5}).*', '$1'将从属性name中获取前5个字符(如果字符串少于5个字符,则取少于5个字符),并删除其余的字符。然后,此属性用于比较$CSV1$CSV2中的记录。参数-PassThru使cmdlet发出原始数据,而不是仅具有custom属性的对象。理论上,您也可以使用$_.name.Substring(0, 5)代替正则表达式替换来提取前5个字符。但是,如果名称少于5个字符(如$CSV1的第一条记录),则会引发错误。

默认情况下,Compare-Object输出输入对象之间的差异,因此,您还需要添加参数-IncludeEqual-ExcludeDifferent以获得匹配的记录。

通过Select-Object * -Exclude SideIndicator插入结果,以从输出中删除属性SideIndicator

答案 1 :(得分:0)

                table#dataTable.table.table-bordered(width='100%', cellspacing='0')
                  thead
                    tr
                      th ID
                      th Name
                      th Type
                      th URL
                      //- th explanation
                      th Image
                      th Keyword
                      th Project Start
                      th Porject End
                      th Github URL
                  tbody
                    each data in dataArray
                      tr
                        td
                          a(href=`/${userId}/${data.id}`)=`${data.id}`
                        td= `${data.name}`
                        td= `${data.type}`
                        td
                          a(href=`${data.url}`)=`${data.url}`
                        //- td= `${data.explanation}`
                        td
                          img(src=`${data.imgurl}`)
                        td= `${data.sumlang}`
                        td= `${data.pjdate1}`
                        td= `${data.pjdate2}`
                        td
                          a(href=`${data.githuburl}`)=`${data.githuburl}`

或:

foreach ($record in $CSV1) {
    $CSV2 | Where {"$($_.name)12345".SubString(0, 5) -eq "$($record.name)12345".SubString(0, 5)} |
        ForEach {[PSCustomObject]@{Name1 = $Record.Name; Name2 = $_.Name}}
}

使用此Join-Object cmdlet:

... | Where {($_.name[0..4] -Join '') -eq ($record.name[0..4] -Join '')} | ...

以上所有结果为:

$CSV1 | Join $CSV2 `
    -Using {($Left.name[0..4] -Join '') -eq ($Right.name[0..4] -Join '')} `
    -Property @{Name1 = {$Left.Name}; Name2 = {$Right.Name}}