从 1000 多个与连续行数据匹配的 csv 文件中过滤数据

问题描述 投票:0回答:1

在 Windows 上,这可能是 Powershell 解决方案吗?

我想要检查并从中获取数据的文件夹中有 1000 多个 csv 文件。

为了这篇文章的目的,我简化了 csv,它有 3 列 - 行、时间和 RecvBytes

row,time,RecvByts
1,19/Mar/2024:02:50:17 ,3614
2,19/Mar/2024:02:50:18 ,3614
3,19/Mar/2024:02:50:20 ,4256
4,19/Mar/2024:02:50:20 ,166293
5,19/Mar/2024:02:50:20 ,166293
6,19/Mar/2024:02:50:20 ,166293
7,19/Mar/2024:02:50:21 ,161693
8,19/Mar/2024:02:50:21 ,177112
9,19/Mar/2024:02:50:21 ,146236
10,19/Mar/2024:02:50:21 ,146236

我需要在 RecvByts 列中保留具有连续匹配值的行 - 我会将这些行写入一个新文件以使事情保持简单。

In the sample above rows 1,2,4,5,6,9,10 would be kept because 

row 2.RecvByts = row 1.RecvByts - keep both these rows
row 5.RecvByts = row 4.RecvByts - keep both these rows
row 6.RecvByts = row 5.RecvByts - keep both these rows
row 10.RecvByts = row 9.RecvByts - keep both these rows

所以输出将如下所示:

row,time,RecvByts
1,19/Mar/2024:02:50:17 ,3614
2,19/Mar/2024:02:50:18 ,3614
4,19/Mar/2024:02:50:20 ,166293
5,19/Mar/2024:02:50:20 ,166293
6,19/Mar/2024:02:50:20 ,166293
9,19/Mar/2024:02:50:21 ,146236
10,19/Mar/2024:02:50:21 ,146236

我尝试过但失败的第一部分是比较连续的行:

$fileIn = import-csv C:\123.csv
$fileOut = @()

foreach($a in $fileIn) {
    if($a.RecvByts -eq $fileOut[+1].RecvByts) {
    $fileOut += $a
     }
 }

$fileOut

谢谢

D/

powershell csv
1个回答
0
投票

做好这个作品的关键是记住之前的记录。
这是在

$PreviousRecord
变量中完成的。
$GotMatch
用于指示是否有先前的匹配。

#function Get-FilteredCsvFile {
[CmdletBinding()]
param (
    [string] $CsvIn = './so78193180.csv'
)

begin {
    $Records = Import-Csv -Path $CsvIn
    $PreviousRecord = $null
    $GotMatch = $false
}

process {
    foreach ($Record in $Records) {
        if ($PreviousRecord.RecvByts -eq $Record.RecvByts) {
            $PreviousRecord
            $GotMatch = $true
        } else {
            if ($GotMatch) {
                $PreviousRecord
                $GotMatch = $false
            }
        }
        $PreviousRecord = $Record
    }
}

end {
    if ($GotMatch) { $PreviousRecord }
}
#}

基于问题中的数据运行的示例。

PS C:\src\t> .\so78193180.ps1

row time                  RecvByts
--- ----                  --------
1   19/Mar/2024:02:50:17  3614
2   19/Mar/2024:02:50:18  3614
4   19/Mar/2024:02:50:20  166293
5   19/Mar/2024:02:50:20  166293
6   19/Mar/2024:02:50:20  166293
9   19/Mar/2024:02:50:21  146236
10  19/Mar/2024:02:50:21  146236
© www.soinside.com 2019 - 2024. All rights reserved.