【问题标题】:Powershell - Comparing two filesPowershell - 比较两个文件
【发布时间】:2014-08-05 01:19:41
【问题描述】:

我正在尝试比较两个 csv 文件,每列一列,一列带有数字 (4590987),一列带有数字扩展名 (4590987.htm)。我想找到所有匹配项,并将它们写入另一个 csv 文件,这样我就可以使用它来将文件从文件夹中取出并将它们复制到 另一个文件夹进行进一步处理。我对带有标题的 csv 文件进行了排序,但无法弄清楚如何比较和写出结果。或者将数字列表与文件夹的内容进行比较,然后将这些文件复制出来。唯一的问题是我的列表大约有 3000 行,目录中有大约 45000 个文件,所以我担心这可能需要一段时间。

 $csv1 = Import-Csv $readfilebasesorted1
 $csv2 = Import-Csv $readlistsorted1

   $hash = @{} 

    $match = "^\d{7}"

     $funmatch = ([regex]::matches($csv1, $match))

        foreach ($line in $funmatch){

           foreach ($lines in $csv2){
            if ($line -match $lines){

               $hash += $line
               $hash = Write-Output $result
               }
            }
   }

新代码,希望格式更好。

    $a = Import-CSV "C:\read\20140630.csv" - header("ProID","EventDate","EventType","EventNotes")
    $scrdir = '\\pl1\Prolaw\gwdocs\4754-66921'
    $sortedlist = 'C:\ProLaw\sortedlist.csv'
    $docs = 'C:\ProLaw\Docs'

    # Sort 
    $sort = $a | Sort-Object ProID | Export-Csv $sortedlist -NoTypeInformation


    $listtomove = Import-Csv $sortedlist
    $scrdir = '\\pl1\Prolaw\gwdocs\4754-66921' 

    GCI $scrdir | ?{$listtomove.ProID -contains $_.BaseName} | Select -Expand FullName |  Copy-Item -Destination $docs

【问题讨论】:

  • 你的标题是什么?您不会在代码中显示它们。有了这些,我会给你一个答案。
  • 查看Compare-Object cmdlet。

标签: powershell


【解决方案1】:

哎呀,不,这就是你有 -in 和 -contains 运算符的原因!

好的,这就是你要做的。拉出一个目录列表,对于每个文件,如果它的名称列在您的 CSV 数字列表中,则将该文件移动到任何位置。假设您有一个标题为 FileName 的列,其中列出了所有数字,如下所示:

$ListToMove = Import-CSV $readlistsorted1
$Source = <Path to files>
$Destination = <Path to folder where they need to go>

GCI $Source | ?{$ListToMove.FileName -contains $_.BaseName} |Select -Expand FullName| Move-Item -Destination $Destination

编辑:好的,这是你的代码,与我的结合,它应该可以满足你的需要:

$a = Import-CSV "C:\read\20140630.csv" -header("ProID","EventDate","EventType","EventNotes") 
$scrdir = '\\pl1\Prolaw\gwdocs\4754-66921' 
$docs = 'C:\ProLaw\Docs'
GCI $scrdir | ?{$a.ProID -contains $_.BaseName} | Select -Expand FullName | Copy-Item -Destination $docs

【讨论】:

  • 好的,除了使用 Copy-Item 而不是 Move-Item 之外,我已经根据您的代码重新设计了它,因为我还需要将文件保留在当前目录中。代码运行没有错误,但没有任何内容复制到我的文件夹中。
  • 您还没有回答我在第一条评论中提出的问题。你的 CSV 标题是什么?
  • $a = Import-CSV "C:\read\20140630.csv" -header("ProID","EventDate","EventType","EventNotes") $scrdir = '\\pl1 \Prolaw\gwdocs\4754-66921' $sortedlist = 'C:\ProLaw\sortedlist.csv' $docs = 'C:\ProLaw\Docs' # 排序 $sort = $a |排序对象 ProID | Export-Csv $sortedlist -NoTypeInformation $listtomove = Import-Csv $sortedlist $scrdir = '\\pl1\Prolaw\gwdocs\4754-66921' GCI $scrdir | ?{$listtomove.ProID -包含 $_.BaseName} |选择-展开全名 | Copy-Item -Destination $docs
  • 标题显示在上面的代码中。我使用 ProID 标头作为 $_.BaseName
  • 答案已更新,您的代码已修改,请告诉我这对您有何帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多