在 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/
做好这个作品的关键是记住之前的记录。
这是在
$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