Mantenga los primeros registros (más recientes) de un conjunto de datos de PowerShell según el valor de una columna
Tengo un conjunto de datos que se parece a este:
Situación inicial:
número de mensaje | Estado | Fecha y hora | EM | diferencia horaria | Escribe un nombre | Tipo | Texto2 | Texto 1 | Etiqueta de alarma |
---|---|---|---|---|---|---|---|---|---|
800292 | 2 | 16/02/2024 9:05:57 | 692 | 6344 | Error | 1 | =80+80.25.08-B208.6 | Foto ojo bloqueado | 12231 |
800249 | 2 | 16/02/2024 9:05:57 | 692 | 68 | Error | 1 | =80+80.11.07-B118.5 | Foto ojo bloqueado | 12175 |
800226 | 2 | 16/02/2024 9:05:57 | 692 | 3882 | Error | 1 | =80+80.03.08-B104.6 | Foto ojo bloqueado | 12152 |
800249 | 1 | 16/02/2024 9:04:48 | 773 | 0 | Error | 1 | =80+80.11.07-B118.5 | Foto ojo bloqueado | 12175 |
93004869 | 2 | 16/02/2024 8:52:29 | 685 | 154 | Error | 1 | IFZ-0030.14 | La alimentación debe vaciarse | 21924 |
93004794 | 2 | 16/02/2024 8:52:29 | 678 | 154 | Error | 1 | BJ-0030.14.09 | diferencia de velocidad | 21908 |
805052 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.07-M1 | Modo manual | 11586 |
805051 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.06-M1 | Modo manual | 11585 |
805049 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.04-M1 | Modo manual | 11583 |
805048 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.03-M1 | Modo manual | 11582 |
805050 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.05-M1 | Modo manual | 11584 |
805052 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.07-M1 | Modo manual | 11586 |
805051 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.06-M1 | Modo manual | 11585 |
805050 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.05-M1 | Modo manual | 11584 |
805049 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.04-M1 | Modo manual | 11583 |
805048 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.03-M1 | Modo manual | 11582 |
93004869 | 1 | 16/02/2024 8:49:54 | 845 | 0 | Error | 1 | IFZ-0030.14 | La alimentación debe vaciarse | 21924 |
93004794 | 1 | 16/02/2024 8:49:54 | 845 | 0 | Error | 1 | BJ-0030.14.09 | diferencia de velocidad | 21908 |
720669 | 2 | 16/02/2024 8:20:27 | 470 | 40 | Error | 1 | =72+72.04.71-WE1 | Balanza de error general | 8902 |
720669 | 1 | 16/02/2024 8:19:46 | 748 | 0 | Error | 1 | =72+72.04.71-WE1 | Balanza de error general | 8902 |
Quiero mantener el último "Estado" de los valores "MsgNr". Por lo tanto, mi secuencia de comandos debe examinar todas las filas, desde la más nueva hasta la más antigua ("DateTime") y conservar solo aquellas en las que "MsgNr" es único.
Resultado después Sort-Object -Property MsgNr -Unique
:
número de mensaje | Estado | Fecha y hora | EM | diferencia horaria | Escribe un nombre | Tipo | Texto2 | Texto 1 | Etiqueta de alarma |
---|---|---|---|---|---|---|---|---|---|
720669 | 1 | 16/02/2024 8:19:46 | 748 | 0 | Error | 1 | =72+72.04.71-WE1 | Balanza de error general | 8902 |
800226 | 2 | 16/02/2024 9:05:57 | 692 | 3882 | Error | 1 | =80+80.03.08-B104.6 | Foto ojo bloqueado | 12152 |
800249 | 2 | 16/02/2024 9:05:57 | 692 | 68 | Error | 1 | =80+80.11.07-B118.5 | Foto ojo bloqueado | 12175 |
800292 | 2 | 16/02/2024 9:05:57 | 692 | 6344 | Error | 1 | =80+80.25.08-B208.6 | Foto ojo bloqueado | 12231 |
805048 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.03-M1 | Modo manual | 11582 |
805049 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.04-M1 | Modo manual | 11583 |
805050 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.05-M1 | Modo manual | 11584 |
805051 | 1 | 16/02/2024 8:52:13 | 210 | 0 | Mantenimiento | 2 | =80+80.11.06-M1 | Modo manual | 11585 |
805052 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.07-M1 | Modo manual | 11586 |
93004794 | 2 | 16/02/2024 8:52:29 | 678 | 154 | Error | 1 | BJ-0030.14.09 | diferencia de velocidad | 21908 |
93004869 | 1 | 16/02/2024 8:49:54 | 845 | 0 | Error | 1 | IFZ-0030.14 | La alimentación debe vaciarse | 21924 |
Mi resultado deseado sería:
número de mensaje | Estado | Fecha y hora | EM | diferencia horaria | Escribe un nombre | Tipo | Texto2 | Texto 1 | Etiqueta de alarma |
---|---|---|---|---|---|---|---|---|---|
800292 | 2 | 16/02/2024 9:05:57 | 692 | 6344 | Error | 1 | =80+80.25.08-B208.6 | Foto ojo bloqueado | 12231 |
800249 | 2 | 16/02/2024 9:05:57 | 692 | 68 | Error | 1 | =80+80.11.07-B118.5 | Foto ojo bloqueado | 12175 |
800226 | 2 | 16/02/2024 9:05:57 | 692 | 3882 | Error | 1 | =80+80.03.08-B104.6 | Foto ojo bloqueado | 12152 |
93004869 | 2 | 16/02/2024 8:52:29 | 685 | 154 | Error | 1 | IFZ-0030.14 | La alimentación debe vaciarse | 21924 |
93004794 | 2 | 16/02/2024 8:52:29 | 678 | 154 | Error | 1 | BJ-0030.14.09 | diferencia de velocidad | 21908 |
805052 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.07-M1 | Modo manual | 11586 |
805051 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.06-M1 | Modo manual | 11585 |
805049 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.04-M1 | Modo manual | 11583 |
805048 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.03-M1 | Modo manual | 11582 |
805050 | 2 | 16/02/2024 8:52:15 | 395 | 2 | Mantenimiento | 2 | =80+80.11.05-M1 | Modo manual | 11584 |
720669 | 2 | 16/02/2024 8:20:27 | 470 | 40 | Error | 1 | =72+72.04.71-WE1 | Balanza de error general | 8902 |
El script de PowerShell se ve así:
$datasetAlg.Tables[0] |
select -first 20|
select MsgNr,State,DateTime,Ms,TimeDiff,Typename,Type,Text2,Text1,AlarmTag |
Sort-Object -Property DateTime |
Sort-Object -Property MsgNr -Unique |
Export-CSV "D:\WinCC_Active_Messages_result.csv"
Necesito tener sólo las filas que contienen el último "Estado" (y otros contenidos de fila) de todos los valores de "MsgNr". Entonces, para obtener los valores más recientes, los ordeno del más nuevo al más antiguo. Luego quiero mantener todas las filas donde el primer encuentro de un valor "MsgNr" es único. De esa manera obtengo el último "Estado" (y otros contenidos de fila) de todos los valores de "MsgNr".
Los valores de MsgNr deben permanecer ordenados por Fecha y hora y el resultado debe tener el primer registro de cada MsgNr único enumerado en ese orden. (Así que los últimos registros primero)
Sort-Object -Property MsgNr -Unique
no parece respetar el orden que clasifiquéSort-Object -Property DateTime |
Al hacer esto, Sort-Object -Property DateTime | Sort-Object -Property MsgNr
primero se ordenará la colección usando DateTime
la propiedad y luego se reordenará todo el resultado según la propiedad MsgNr. Al final, sería equivalente a simplemente hacer Sort-Object -Property MsgNr
.
Si deseas ordenar algo por múltiples propiedades, debes hacerlo en el mismo Sort-Object
cmdlet, separando las propiedades mediante una coma ,
. Para orden descendente, puedes usar -Descending
:
$datasetAlg.Tables[0] |
select -first 20|
select MsgNr,State,DateTime,Ms,TimeDiff,Typename,Type,Text2,Text1,AlarmTag |
Sort-Object -Property DateTime,MsgNr -Unique -Descending |
Export-CSV "D:\WinCC_Active_Messages_result.csv"
Más información se puede encontrar en la documentación.