2
votes

Diviser une chaîne spécifique à partir de lignes via une expression régulière

J'ai essayé d'extraire certaines valeurs égales à 40 pour obtenir le sixième dernier mot de plusieurs lignes dans un fichier .txt avec PowerShell.

J'ai du code jusqu'à présent:

hostname01
hostname02
hostname03 developer host

Fichier Txt: (peut être des lignes en double comme hostname01)

4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname02,xx,1549429809,0000000507,1549430316,xxx,0,15,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname03 developer host,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100

Voici ce que je veux:

$file = Get-Content 'c:\temp\file.txt'
$Array = @()
foreach ($line in $file)
{
$Array += $line.split(",")[6]
}
$Array
$Array | sc "c:\temp\export2.txt"


0 commentaires

4 Réponses :


0
votes

Vous pouvez utiliser un groupe non capturant pour rechercher dans la chaîne le format correct et référencer le nom de votre 6 élément avec le 1er groupe de capture $ 1 :

(?:\d+,\d,\d,\d,[A-Z]+,[A-Z]+,)([a-zA-Z 0-9]+)

Démo ici

  • (?:) - Spécifie un groupe sans capture (ce qui signifie qu'il n'est pas référencé via $ 1, ou $ 2 comme vous le feriez normalement avec un groupe de capture
  • \ d +, (je ne vais pas répéter tout cela, mais) à la recherche d'un ou plusieurs chiffres suivis d'un littéral , .
  • [A-Z] +, - Recherche une chaîne de lettres majuscules, suivie d'un littéral , (cela se produit deux fois).
  • ([a-zA-Z 0-9] +) - Le groupe de capture que vous recherchez, $ 1, qui capturera tous les caractères az , AZ , des espaces et des chiffres jusqu'à un caractère ne figurant pas dans cet ensemble (dans ce cas, une virgule). Vous donner le texte que vous recherchez.


0 commentaires

0
votes

Si le champ souhaité est toujours le 6e de la ligne, il est plus facile de diviser chaque ligne et de récupérer le 6e membre:

Get-Content 'c:\temp\file.txt' | Foreach-Object {($_ -split ',')[6]} | Select-Object -Unique


3 commentaires

Mais je vais extraire certaines valeurs égales à 40 pour obtenir le sixième dernier mot.


J'ai peur de ne pas comprendre ce que tu veux dire. Désolé.


Je veux dire, je veux juste capturer la ligne qui appartient à la valeur 40 dans telle que 4626898,0,3,0, POL, INCR, hostname01, xx, 1549429809,0000000507,1‌ 549430316, xxx, 0, 40 , 1‌, xxxx, 51870834,5040, ‌ 100.



0
votes

Ci-dessous devrait fonctionner avec ce que vous essayez de faire

Get-Content 'c:\temp\file.txt' | %{ 
    $_.Split(',')[6]
}| select -Unique


0 commentaires

3
votes

Ce n’est pas une solution rapide , mais une solution pratique et flexible :

  • Comme votre fichier texte est en fait un fichier CSV, vous pouvez utiliser Import-Csv .

    • Puisque vos données sont manquantes, il y a une ligne d'en-tête (noms de colonne), que nous pouvons fournir à Import-Csv via son -Header paramètre.
    • Puisque vous êtes intéressé par les colonnes numéro 7 (noms d'hôte) et 14 (le nombre dont la valeur doit être 40 ), nous avons besoin pour fournir les noms de colonnes (de notre choix) pour les colonnes 1 à 14.
  • Import-Csv convertit facilement les lignes CSV en objets (personnalisés), dont vous pouvez interroger les propriétés avec Where-Object et extraire sélectivement avec Select-Object ; l'ajout de -Unique supprime les valeurs en double.

Pour tout rassembler:

... | Set-Content c:\temp\export2.txt

Pour plus de commodité, nous avons nommé les colonnes 1 , 2 , ... en utilisant une expression de plage ( 1..14 ), mais vous êtes libre d'utiliser des noms descriptifs.

En supposant que c: \ temp \ file.txt contient vos exemples de données, ce qui précède donne:

hostname01
hostname03 developer host

Pour sortir dans un fichier, dirigez ce qui précède vers Set-Content , comme dans votre question:

Import-Csv c:\temp\file.txt -Header (1..14) | 
  Where-Object 14 -eq 40 |
    Select-Object -ExpandProperty 7 -Unique


1 commentaires

Il y a une question de suivi relative à la vitesse sur révision du code avec votre code.