【问题标题】:Specific match between two CSV files两个 CSV 文件之间的特定匹配
【发布时间】:2019-02-10 11:59:06
【问题描述】:

我有两个这样的 CSV 文件:

CSV1:

姓名 测试; 测试和示例; 测试&示例&再次测试;

CSV2:

姓名 测试1; 测试示例; 测试&示例&再次测试;

我想比较 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
}

【问题讨论】:

    标签: powershell csv match


    【解决方案1】:

    您可以使用Compare-Object 和自定义属性定义来做到这一点。

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

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

    默认Compare-Object输出输入对象之间的差异,所以你还需要添加参数-IncludeEqual-ExcludeDifferent才能得到匹配的记录。

    通过Select-Object * -Exclude SideIndicator 传递结果以从输出中删除属性SideIndicator

    【讨论】:

      【解决方案2】:
      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}}
      }
      

      或:

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

      使用这个Join-Object cmdlet:

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

      以上所有结果:

      Name1                       Name2
      -----                       -----
      test & example;             test & example&testagain;
      test & example & testagain; test & example&testagain;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        • 2016-12-09
        相关资源
        最近更新 更多