【问题标题】:Counting rows in 2 CSV files for comparison计算 2 个 CSV 文件中的行数以进行比较
【发布时间】:2017-08-11 22:57:45
【问题描述】:

我有一个 PowerShell 脚本,几乎可以满足我的需求。

基本上存在写入特定位置并按年和月存储的 CSV 文件提要。我必须比较两个最新 CSV 文件之间的行数,因为较大的差异表明存在问题。

目前我的脚本获取最新的 CSV 文件并毫无问题地返回行数,但我不知道如何让它返回 2 个最新文件的行数。这可能是由于我构建脚本的方式:

$datemonth = (Get-Date).Month 
$dateyear  = (Get-Date).Year 

## get latest csv files
$dir = "\\160.1.1.98\c$\Scheduled Task Software\ScheduledTask\Application Files\ScheduledTask_1_0_0_9\Files\$dateyear\$datemonth\SentFeedFiles"
$latest = Get-ChildItem -Path $dir |
          Sort-Object LastAccessTime -Descending |
          Select-Object -First 1

## get path to csv files, add headers and count number of rows.
$filepath = $dir + '\' + $latest

$CSVCOUNT = (Import-Csv $filepath -Header 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28).Count 

如果我更改为-First 2,则会收到以下错误:

Import-Csv:找不到文件 '\16.1.1.18\c$\Scheduled Task Software\ScheduledTask\Application Files\ScheduledTask_1_0_0_9\Files\2017\3\SentFeedFiles\lkrlkr200317.csv lkrlkr19017.csv'。

我知道为什么会出现此错误 - 它试图将两个文件名连接到一个路径中。但是,我不知道如何解决这个问题。我在想可能需要一个循环,但我不确定在哪里。

【问题讨论】:

  • 哪两个文件?只有目录中的前两个,按 LastAccessTime 排序?
  • 是的。目录中最新的两个。目录将根据月份和年份而变化。
  • 您有两个结果...所以将它们传送到 foreach 语句...在其中,对您调用的对象执行 CSVcount 或 $_ 如果您不命名它们。查看 powershell foreach 语句
  • 您是否需要将这些文件实际视为 CSV(即,您之后是否要在此脚本中处理文件中的数据)?如果没有,那么(Get-Content $file).Length 会告诉你文件的行数。

标签: powershell csv


【解决方案1】:

在 f:\tmp 本地抓取 3 个 CSV 文件进行测试:

$dir = "F:\tmp"
$files = Get-ChildItem -Path $dir | Sort-Object LastAccessTime -Descending | Select-Object -First 2

($files | Get-Content).Count

据我所知,Import-Csv 只处理一个文件 - 所以你不能将两个文件路径传递给它。

如果你想使用 Import-CSV(用于忽略标题等),你可以 foreach 文件,但你必须将完整路径传递给它:

($files.FullName | % { Import-Csv -Path $_ }).Count

要获得两个单独的结果,请执行以下操作:

包括标题:

($files[0] | Get-Content).count
($files[1] | Get-Content).count

排除标题:

(Import-Csv -Path $files[0].FullName).Count
(Import-Csv -Path $files[1].FullName).Count

【讨论】:

  • 这似乎更好 - 但似乎将两者加在一起?我猜我需要一个 foreach 循环,但不确定我如何引用对象
  • 现在就排序
  • 不确定将两者相加是什么意思?这不是你想要做的吗?我的原始示例(上一个)包括 CSV 标头。
  • 我正在寻找两个单独的结果。当我运行您的解决方案时,它将两个文件的行数加在一起。我希望能够比较这两个数字。
  • 更简单:$files | % { @(Import-Csv $_.FullName -Header (1..28)).Count }。或者 $files | % { @(Get-Content $_.FullName).Count } 如果文件首先没有标题。
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2021-07-20
  • 2013-11-07
相关资源
最近更新 更多