【问题标题】:Matching content across CSV and writing matched data跨 CSV 匹配内容并写入匹配的数据
【发布时间】:2019-08-27 19:08:31
【问题描述】:
  1. 两个 CSV。 $CSV1 和 $CSV2。
  2. CSV1 有 50 列,40,000 行(和标题。)
    CSV2 有 17 列,约 900 行,还有标题。)
  3. 我需要匹配 $CSV1 中的每一行 $CSV1.B and $CSV1.K
    匹配 $CSV2 中的任何行,其中 $CSV2.B and $CSV2.H 匹配,
    然后从 $CSV2 中匹配的行中获取 $CSV2.K。 澄清一下,如果 $CSV1 中的 ItemNumber 为 137 且 Sold 为 15 - 我需要在 $CSV2 中找到 ItemNumber 为 137 且 Sold 为 15 的任何行。然后,我需要在该行中提取 TargetData 的值,然后附加到 CSV1 的新副本,在其自己行的新列中 - 用于 CSV1 中的每一行。
  4. 然后我需要将匹配的 $CSV2.K 附加到 $CSV1 的新副本中,并将匹配的数据添加到带有新标题的新列中。

我对 powershell 中的 CSV 工作并不太熟悉,非常感谢任何输入。

尝试将每个 CSV 放入一个数组,并在 Array2 上运行 foreach-object 循环以匹配 $CSV2 WHERE $CSV1.B 和 $CSV2.K 匹配 $CSV2.B 和 $CSV2.H,然后创建自定义 PSOBJECT与 $CSV2.K。这不起作用。

$CSV1 = import-csv C:\Users\blah\sqlexport.csv
$array1=@()

$csv2= Import-Csv -Path  (Get-ChildItem -Path C:\Users\blah\csvset\-Filter '*.csv').FullName
$array2=@()

$csv1 | foreach-object {
     $csv2 | Where-Object { $CSV1.ItemNumber -eq $_.ItemNumber -and $CSV1.Sold -eq $_.Sold }
    [PSCustomObject]@{
        Value1 = $CSV1.ItemNumber
        Value2 = $CSV1.Sold
        Value3 = $CSV2.TargetData
    }
} | export-csv -path C:\Users\blah\test.csv -NoTypeInformation -Append

【问题讨论】:

  • 到目前为止您尝试过什么?向我们展示你的工作。
  • 我尝试将它们输入到 aray 中,但我不知道该怎么做。在代码中编辑。
  • @CharlieC 你能发布你到目前为止尝试过的代码吗?
  • 你应该用一个例子来解释你第3点的匹配,$csv1/$csv2中的匹配与另一个文件有什么关系?
  • @LotPings - 解释包含在第 3 点中。B 和 K 列中每一行的 $CSV1 中的内容需要与 $CSV2 中 B 列和 H 中的任何行中的内容相匹配。 $CSV2 中的匹配行需要提取 $CSV2.K,并在新列中每行导出到 CSV1 的新 CSV 克隆。

标签: powershell


【解决方案1】:

提供给定的列名 ItemNumber,Sold,TargetData 确实存在,
这个使用计算属性的快速而肮脏的脚本应该可以,
只需替换 .CSV 路径\文件名。

$hash=@{}
Import-Csv .\CSV2.csv | ForEach-Object{$hash["$($_.ItemNumber),$($_.Sold)"]=$_.TargetData}

Import-Csv .\CSV1.csv |
  Select-Object -Property *,@{n='TargetData';e={$hash["$($_.ItemNumber),$($_.Sold)"]}} |
    Export-Csv .\New-CSV1.csv -NoTypeInformation

根据您的评论,试试这个:

Import-Csv (Get-ChildItem -Path C:\Users\blah\bunchofcsvs\ -Filter '*.csv').FullName | 
    ForEach-Object{$hash["$($_.'Item Number'),$($_.Sold)"]=$_.TargetData} 
 
Import-Csv C:\Users\blah\sqlexportcsv\csv.csv | 
    Select-Object -Property *,@{n='TargetData';e={$hash["$($_.ItemNumber),$($_.SoldQty)"]}} | 
        Export-Csv New.csv -NoTypenformation

【讨论】:

  • 我会在早上测试这个第一件事并更新你。计算的属性超出了我的范围 - 你有没有机会为我分解它,或者提供关于函数的文档?
  • 这就是我正在运行的。它确实运行,确实克隆了 CSV,但 TargetData 列又是空的。 Import-Csv (Get-ChildItem -Path C:\Users\blah\bunchofcsvs\ -Filter '*.csv').FullName | ForEach-Object{$hash["$($_."Item Number"),$($_.Sold)"]=$_."TargetData"} Import-Csv C:\Users\blah\sqlexportcsv\csv. CSV | Select-Object -Property *,@{n='TargetData';e={$hash["$($_.ItemNumber),$($_.SoldQty)"
  • 抱歉回复晚了。您的代码中有一些引用错误,列命名也不同,请使用单引号 inside 双引号字符串。查看更改后的答案。
  • -第二个散列缺少闭合曲线,第二个散列缺少方括号。添加了它们,仍然说文字不完整。看不到第一轮和第二轮的哈希值之间的区别。
  • 很抱歉(已从您的代码中接管)它缺少两个大括号,现在应该是正确的,列/属性命名取决于您。
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多