Mantenga los primeros registros (más recientes) de un conjunto de datos de PowerShell según el valor de una columna

Resuelto HoRiOnS asked hace 7 meses • 0 respuestas

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 -Uniqueno parece respetar el orden que clasifiquéSort-Object -Property DateTime |

HoRiOnS avatar Feb 16 '24 16:02 HoRiOnS
Aceptado

Al hacer esto, Sort-Object -Property DateTime | Sort-Object -Property MsgNrprimero se ordenará la colección usando DateTimela 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-Objectcmdlet, 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.

Cid avatar Feb 16 '2024 10:02 Cid