IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

[debutant] taille,numero ligne,tri et affichage partiel d'un fichier [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut [debutant] taille,numero ligne,tri et affichage partiel d'un fichier
    Bonjour,
    Je debute en PS1 que je ne connais pas.
    Pour mon premier script, je dois trouver les x lignes les plus longues d'un fichier.

    Pour ca je voudrais récupérer le numero de ligne et la taille de la ligne ( éventuellement la ligne aussi ) et trier par taille de ligne.
    voila ce que j'ai fait (/trouvé) j'aimerai vos avis éclairés pour faire plus simple, plus performant, plus ... mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function addLine
     {
     param([int]$LineNb,[int]$Size,[string]$Content)
     $d=New-Object PSObject
     $d | Add-Member -Name LineNb -MemberType NoteProperty -Value $LineNb
     $d | Add-Member -Name Size -MemberType NoteProperty -Value $Size
     $d | Add-Member -Name Content -MemberType NoteProperty -Value $Content
     return $d
     }
    
    $MaListe=@()
    $a=Get-Content('nom_fichier')
    $counter = 1
    Foreach ( $line in $a ) {
     
          $MaListe+=addLine  $counter $line.Length  $line
          #$MonTableau += $line.Length $counter $line
          $counter += 1
    }
     
    # $MaListe |Sort-Object -Property Size -Descending  |Select-Object  -Index 0 |Format-Table -AutoSize 
     
    
    $toto=  $MaListe |Sort-Object -Property Size -Descending  
    $toto[0..3] |Format-Table -AutoSize 
     
     }
    merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Une première idée

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $cnt = 1
     
    $result = Get-Content -Path "nom_fichier" -Encoding Default | 
    Select-Object @{Name = "Size" ; Expression={ $_.Length }}, @{Name = "Content" ; Expression={ $_ }} | 
    Sort-Object -Property Size -Descending | 
    Select-Object @{ Name = "LineNb" ; Expression={ (([ref]$cnt).Value++) }}, *
     
    $result[0..3] | Format-Table -AutoSize

  3. #3
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    J'ai mis le numero de ligne dans le premier select-object et j'obtiens bien le résultat que j'attends,
    merci

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Maintenant je voudrais juste les lignes qui ont une taille superieure a 100 par exemple
    J'ai fais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $cnt = 1
     
    $result = Get-Content -Path "nom_fichier" -Encoding Default | 
      Select-Object @{ Name = "LineNb" ; Expression={ (([ref]$cnt).Value++) }} ,
                    @{Name = "Size"    ; Expression={ $_.Length }} ,
                    @{Name = "Content" ; Expression={ $_ }} | 
      Sort-Object -Property Size -Descending 
     
    #$result[0..4] | Format-Table -AutoSize
    
    $result | ForEach-Object {
              if($_.Size -gt 100){ $_ }
    
    } | Sort-Object -Property LineNb  | Format-Table -AutoSize
    mais j'ai l'imression de mouliner trop de donnée,
    je n'ai pas reussi à faire un break si la taille est inferieure à 100 ( puisque c'est trié par taille decroissante )

    Avez vous des conseils svp ?
    PS: comment mettre du code en couleur comme au dessus ?

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je pensai que LineNb devait être en fonction du tri ? Apparemment non c'est le numéro de ligne dans le fichier d'origine.

    Utilise la clause Where-Object pour filtrer.
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    $result | Where-Object {$_.Size -gt 100}} | Sort-Object -Property LineNb  | Format-Table -AutoSize

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    merci, j'arrive donc à
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $cnt = 1
    Get-Content -Path "nom_fichier" -Encoding Default | 
      Select-Object @{Name = "LineNb"  ; Expression={ (([ref]$cnt).Value++) }} ,
                    @{Name = "Size"    ; Expression={ $_.Length }} ,
                    @{Name = "Content" ; Expression={ $_ }} | 
      Where-Object {$_.Size -gt 100} |
      Sort-Object -Property LineNb | 
      Format-Table -AutoSize

    c'est plus efficace qu'une boucle foreach ?

    et pour avoir Code powershell (en couleur) à la place de Code ( en noir et blanc ) c'est ou ? merci ericlm128

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    c'est plus efficace qu'une boucle foreach ?
    En consommation mémoire certainement.

    Pour avoir la couleur syntaxique il faut que tu utilise le bouton # et dans la première balise après CODE tu ajoute =powershell

  8. #8
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Merci,

    Pourquoi $cnt.Value++donne une erreur et pas ([ref]$cnt).Value++ ?
    et pourquoi une parenthèse de plus (([ref]$cnt).Value++ ) ?

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Pourquoi $cnt.Value++donne une erreur et pas ([ref]$cnt).Value++ ?
    Il faut que tu te renseigne sur l'accès au variable par valeur ou par référence.
    Simplement, ".value" est une propriété spécifique au type retourné par "[ref]". Si tu n'utilise pas "[ref]" tu n'a pas cette propriété de disponible.


    et pourquoi une parenthèse de plus (([ref]$cnt).Value++ ) ?
    Une parenthèse de trop je pense.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche debut de ligne dans fichier texte en vba
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/07/2008, 17h27
  2. [Debutant]Effacer des lignes dans un fichier
    Par smutmutant2003 dans le forum Linux
    Réponses: 13
    Dernier message: 10/10/2007, 21h49
  3. Réponses: 3
    Dernier message: 25/06/2007, 13h14
  4. [CSV] Taille d’une ligne d’un FICHIER
    Par sam01 dans le forum Langage
    Réponses: 1
    Dernier message: 22/01/2007, 11h22
  5. [debutant] supprimmer une ligne d'un fichier
    Par F.F. dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2005, 08h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo