计算2个CSV文件中的行以进行比较

时间:2017-03-20 15:20:41

标签: powershell csv

我有一个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'。

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

1 个答案:

答案 0 :(得分: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(用于忽略标题等),您可以预先处理文件,但必须将完整路径传递给它:

($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