Question Aide sur le tri et doublons dans un fichier

Plus d'informations
il y a 15 ans 5 mois #7935 par CHRETIEN
Bonjour,

Je cherche à un trier un fichier CSV (le delimiter est le point virgule) ayant ce format là :

Nom hote IP Espace Disk Date inventaire
Poste1 166.69.1.104 2345 17/10/2010 12:13
Poste2 166.69.1.106 123 12/10/2010 17:43
Poste2 166.69.1.106 54687 13/10/2010 10:00
Poste1 166.69.1.104 675 15/10/2010 11:13
Poste3 166.69.1.116 7876 08/10/2010 14:43
Poste1 166.69.1.104 2345 16/10/2010 16:20
Poste4 166.69.1.118 8755 08/09/2010 11:20

Je voudrais qu'il soit trié sur le premier champ et qu'il n'y ai pas de doublons. Jusqu'à là je crois savoir comment faire, un truc dans ce genre là:

Get-content $file_entree | Sort-Object | Get-Unique > $file_sortie

Mais la difficulté se trouve au niveau de la date, parmi les doublons, j'aimerai que le poste ayant la date d'inventaire la plus élevée ressorte.

ce qui nous donnerait en sortie :

Nom hote IP Espace Disk Date inventaire
Poste1 166.69.1.104 2345 17/10/2010 12:13
Poste2 166.69.1.106 54687 13/10/2010 10:00
Poste3 166.69.1.116 7876 08/10/2010 14:43
Poste4 166.69.1.118 8755 08/09/2010 11:20

Merci de votre aide, vous me rendriez un grand service !
A+ et bon dimanche
Nico<br><br>Message édité par: NICOBOX, à: 17/10/10 12:26

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #7936 par Laurent Dardenne
Salut,
si tu géres tes informations comme du texte, étant donnée que c'est du CSV, le tri sur la date ne pourra se faire car son extraction est incertaine.

Une solution, on importe le contenu du fichier en tant qu'objet, on crée un objet personnalisés avec des champs typés, puis on les traite avec les cmdlets de base.
[code:1]
#Importe des lignes et construit une liste d'objets personnalisé
$Infos=Import-csv \&quot;test.txt\&quot; -delimiter \&quot;;\&quot;|
Foreach {
New-object PSObject -Property @{
# On type les champs pour le tri
Poste=[string]$_.Poste;IP=[IPAddress]$_.ip;truc=$_.truc;date=$_.date -as [DateTime]
}
}

#Récupére le poste le plus récent
$Result=$Infos|
#On regoupe les objets par le champ Poste
#chaque groupe concerne 1 seul poste
Group-Object poste|
Foreach {
#Tri le groupe sur le champs date et sélectionne le premier de la liste
$_.group|
Sort Date -Descending|
Select-Object -First 1
}[/code:1]
En une seule passe
[code:1]
#Importe des lignes et construit une liste d'objets personnalisé
$Result=Import-csv \&quot;test.txt\&quot; -delimiter \&quot;;\&quot;|
Foreach {
New-object PSObject -Property @{
Poste=[string]$_.Poste;IP=[IPAddress]$_.IP;Truc=$_.Truc;date=$_.Date -as [DateTime]}
}|
Group-Object Poste|
Foreach {
$_.group|
Sort Date -Descending|
Select-Object -First 1
}

#contrôle du résultat
$Infos|Group Poste|% {Write-Host (\&quot;-\&quot; * 80);$_.group}
$Result[/code:1]

La version sans créer d'objets personnalisés, tous les champs sont dans ce cas de type [String] :
[code:1]
$Result=Import-csv \&quot;test.txt\&quot; -delimiter \&quot;;\&quot;|
Group-Object Poste|
Foreach {
$_.group|
Sort Date -Descending|
Select-Object -First 1
}
[/code:1]
Il peut y avoir d'autres solutions.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 4 mois #7978 par Jacques Barathon
J'arrive après la bataille, mais comme moi aussi ça fait un bail que je n'ai pas posté sur ce forum, je commence doucement... :P

Une façon de faire alternative :

[code:1]
import-csv &lt;fichier&gt; -delim \&quot;;\&quot; | sort \&quot;nom hote\&quot;,{$_.\&quot;date inventaire\&quot; -as [datetime]} | sort \&quot;nom hote\&quot; -unique
[/code:1]

En gros, il suffit d'indiquer au moment du tri que le champ \&quot;date inventaire\&quot; doit être pris en compte comme une date. Il faut refaire un tri dans la foulée pour pouvoir extraire l'élément unique pour chaque poste.

Si c'est bien ça qui était demandé ?...

Sur ce, bonne nuit les petits,

Janel

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.039 secondes
Propulsé par Kunena