【问题标题】:Read latest content from multiple CSV files and sort-Logic从多个 CSV 文件中读取最新内容并排序逻辑
【发布时间】:2026-01-15 15:10:01
【问题描述】:

我需要获得使用多个 CSV 文件进行一种类型的排序/过滤的逻辑。问题是我有 2 两个 CSV 文件,其中包含一些投资内容。数据应该是这样的:

  • 文件 A_11012015_123.csv(附加时间戳)

     TktNo, AcctID, Rate 
      1      1       187
      2      1       145
      7      2       90
    
  • 文件 A_12012015_1345.csv(附加时间戳)

     TktNo, AcctID, Rate
      1      2       190
      2      2       187
      3      5        43
    

预期的输出文件内容

TktNo, AcctID, Rate
 1      2       190
 2      2       187
 3      5       43
 7      2       90

事情已经尝试过了,不是完全一样的

  $output=@()
  foreach(..)(multple files)
  {
  $output+=Get -Content -path $csv| sort "TktNo: - Unique
   }
   export $output

输出文件的条件

  1. 票号应唯一且有序
  2. 如果两个文件中的票号相同,则应将最新文件的内容添加到输出文件中。

    作为迁移到 power shell 的这一部分,我也是一个初学者,如果有人可以帮助我实施,我将不胜感激。

【问题讨论】:

  • 您有尝试过的什么吗?我知道您正在努力解决这个问题,但如果您不付出更多努力,我认为社区将不愿意帮助您。你的时间格式是什么?第一个示例是上午 1:23,第二个示例是下午 1:45?
  • 谢谢马特。文件名采用日期时间格式 ->mmddyyyy_hhmmss.csv
  • 很好。您的文件名示例不遵循该日期时间模式。

标签: sorting csv powershell compare


【解决方案1】:

这段代码假设了我试图在 cmets 中解决的一些问题。更多说明如下。

Get-ChildItem C:\temp -Filter *.csv | ForEach-Object{
    $rawDate = ($_.BaseName -split "_",2)[1]
    $filedate = [datetime]::ParseExact($rawDate,"MMddyyyy_HHmmss",[System.Globalization.CultureInfo]::CurrentCulture)
    Import-csv $_ | Add-Member -MemberType NoteProperty -Name "Date" -Value $filedate -PassThru
} | Group-Object tktno | ForEach-Object{
    $_.Group | Sort-Object Date | Select -Last 1
} | Select-Object TktNo,AcctID,Rate | Sort-Object TktNo

假设

  1. 您的所有 csv 文件都位于一个位置,例如“c:\temp”。需要的话加-recurse
  2. 您说您的日期格式是“mmddyyyy_hhmmss”。示例文件时间与此不相符。我编辑文件名以使用“MMddyyyy_HHmmss”。 “文件 A_11012015_123321.csv”和“文件 A_12012015_134522.csv”

细分

有几种方法可以做到这一点,但我们在这里使用的一种简单方法是Group-Object。只要您没有 100 个这些文件和 1000 个条目,它就可以解决问题。

获取每个文件,并为每个条目附加其文件数据Import-csv $_ | Add-Member -MemberType NoteProperty -Name "Date" -Value $filedate -PassThru。例如,您将拥有:

TktNo    AcctID    Rate    Date    
-----    ------    ----    ----    
1        1         187     11/1/2015 12:33:21 PM    
2        1         145     11/1/2015 12:33:21 PM    
7        2         90      11/1/2015 12:33:21 PM    

我们获取所有这些文件并根据tktno 将它们组合在一起。在创建的每个组中,按我们之前创建的日期属性对其进行排序,并使用Select -Last 1 返回当前条目。删除日期属性并对tktno上的剩余数据进行排序

至于输出,您可以将其附加到末尾。

} | Select-Object TktNo,AcctID,Rate | Sort-Object TktNo | Export-CSV "C:\somepath.csv" -NoTypeInformation

【讨论】:

  • 谢谢马特。让我插入代码并更新您。
  • Matt- 我已经尝试了代码,但数据没有得到 exp。我得到一个 0KB 的 csv 文件。请指教
  • 您是否还有问题@Renji 或者我应该假设,因为您将其标记为答案,您已经弄清楚了?如果没有,我想知道您是否能够在控制台上获得输出。
  • Matt ,我添加的代码中几乎没有故障。我能够纠正它。非常感谢!!!
  • @Renji 您是否更改了对其他人有用的任何内容?如果我的代码中有错误,我想修复它们。如果这只是与您的情况有关的事情,那么我们就可以不理会了。很高兴它成功了。