Question
Extraire une chaine de caractere
- SP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 12 ans 7 mois #15636
par SP
Extraire une chaine de caractere a été créé par SP
Bonjour,
Je cherche a extraire la chaine de caractere 13:07:31.333 UTC Aug 17 2013(D5B9F413.5572580C) d'une ligne ($_) qui se trouve dans un fichier ($cDevice.log). J'ai obtenu ce fichier a partir de la MIB de mon switch.
Mon script ne sera pas fait que pour récupérer une date mais n'importe quelle donnée après le deuxieme \":\".
Le contenu du fichier $cDevice.log
[code:1]a3Com.jv-mib.huawei.huaweiMgmt.huaweiDatacomm.hwNTP.hwNTPSystemMIB.hwNTPSystemMIBObjects.hwNTPSysState.0 : INTEGER: clockBySyns
a3Com.jv-mib.huawei.huaweiMgmt.huaweiDatacomm.hwNTP.hwNTPSystemMIB.hwNTPSystemMIBObjects.hwNTPSysClock.0 : OCTET STRING- (ascii): 13:07:31.333 UTC Aug 17 2013(D5B9F413.5572580C)
[/code:1]
Ci-joint le code que j'ai commencé a développer. Je suis en train de réfléchir a un moyen de lire chaque ligne caractere par caractere pour ne garder que la fin.
J'ai aussi regardé une maniere de connaitre la position du deuxieme \":\" pour supprimer ce qu'il y a avant.
[code:1]
function Concatenate ($cDevice) # $cDevice = The Device
{
Get-Content \"$Dir_RawSNMP\$cDevice.log\" | ForEach-Object -process {
$_
$cValue = \"$_\".Split(\":\"«»)[2]
Write-Output \"Control point Concatenate-FOR : $cDevice / $cValue\"
Write-Output \"$cDevice;$cValue\" >> $OutputFile
}
}
[/code:1]
$OutputFile est un fichier txt que j'ouvre comme un csv avec Excel
Je cherche a extraire la chaine de caractere 13:07:31.333 UTC Aug 17 2013(D5B9F413.5572580C) d'une ligne ($_) qui se trouve dans un fichier ($cDevice.log). J'ai obtenu ce fichier a partir de la MIB de mon switch.
Mon script ne sera pas fait que pour récupérer une date mais n'importe quelle donnée après le deuxieme \":\".
Le contenu du fichier $cDevice.log
[code:1]a3Com.jv-mib.huawei.huaweiMgmt.huaweiDatacomm.hwNTP.hwNTPSystemMIB.hwNTPSystemMIBObjects.hwNTPSysState.0 : INTEGER: clockBySyns
a3Com.jv-mib.huawei.huaweiMgmt.huaweiDatacomm.hwNTP.hwNTPSystemMIB.hwNTPSystemMIBObjects.hwNTPSysClock.0 : OCTET STRING- (ascii): 13:07:31.333 UTC Aug 17 2013(D5B9F413.5572580C)
[/code:1]
Ci-joint le code que j'ai commencé a développer. Je suis en train de réfléchir a un moyen de lire chaque ligne caractere par caractere pour ne garder que la fin.
J'ai aussi regardé une maniere de connaitre la position du deuxieme \":\" pour supprimer ce qu'il y a avant.
[code:1]
function Concatenate ($cDevice) # $cDevice = The Device
{
Get-Content \"$Dir_RawSNMP\$cDevice.log\" | ForEach-Object -process {
$_
$cValue = \"$_\".Split(\":\"«»)[2]
Write-Output \"Control point Concatenate-FOR : $cDevice / $cValue\"
Write-Output \"$cDevice;$cValue\" >> $OutputFile
}
}
[/code:1]
$OutputFile est un fichier txt que j'ouvre comme un csv avec Excel
Connexion ou Créer un compte pour participer à la conversation.
- SP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 12 ans 7 mois #15637
par SP
Réponse de SP sur le sujet Re:Extraire une chaine de caractere
J'ai modifié le code pour supprimé le debut de la chaine en ajoutant $cSkipLine = (\"$_\".Split(\":\")[0]).Length + (\"$_\".Split(\":\")[1]).Length +3
Auriez-vous une solution plus propre de faire le travail ?
Ce code fonction avec le formatage que j'ai extrait mais je suis pas sur qu'il fonctionne a coup sur.
Je souhaiterai tester si le caractere au debut de la chaine restante est un espace, une tabulation ou directement l'info utile.
[code:1]
function Concatenate ($cDevice) # $cDevice = The Device
{
Get-Content \"$Dir_RawSNMP\$cDevice.log\" | ForEach-Object -process {
$_
$cSkipLine = (\"$_\".Split(\":\"«»)[0]).Length + (\"$_\".Split(\":\"«»)[1]).Length +3
$cValue = \"$_\".Substring($cSkipLine)
Write-Output \"Control point Concatenate-FOR : $cDevice / $cValue\"
Write-Output \"$cDevice;$cValue\" >> $OutputFile
}
}
[/code:1]
Auriez-vous une solution plus propre de faire le travail ?
Ce code fonction avec le formatage que j'ai extrait mais je suis pas sur qu'il fonctionne a coup sur.
Je souhaiterai tester si le caractere au debut de la chaine restante est un espace, une tabulation ou directement l'info utile.
[code:1]
function Concatenate ($cDevice) # $cDevice = The Device
{
Get-Content \"$Dir_RawSNMP\$cDevice.log\" | ForEach-Object -process {
$_
$cSkipLine = (\"$_\".Split(\":\"«»)[0]).Length + (\"$_\".Split(\":\"«»)[1]).Length +3
$cValue = \"$_\".Substring($cSkipLine)
Write-Output \"Control point Concatenate-FOR : $cDevice / $cValue\"
Write-Output \"$cDevice;$cValue\" >> $OutputFile
}
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 12 ans 6 mois #15818
par Philippe
Réponse de Philippe sur le sujet Re:Extraire une chaine de caractere
salut sp973
- les lignes vierge
- les lignes sans la partie valeur
- les lignes au format different (pas deux fois les deux points)
Va voir ici pour quelque idée : Aide Mémoire PowerShell
[code:1]$cValue = ($_.remove(0,$_.IndexOf(\":\"«»)+1)).remove(0,($_.remove(0,$_.IndexOf(\":\"«»)+1)).IndexOf(\":\"«»)+1).TrimStart()[/code:1]
mais ce n'est qu'un exemple a partir des fonctions string disponible, pas la solution (je fais souvent mes propres fonctions)
En programmation et donc avec PowerShell, il y a souvent plusieurs techniques disponibles pour effectuer une même action, c'est ce qui permet de s'adapter au mieux à chaque situation.
tu a trois cas qui risque de te provoqué des erreurs (a géré en try/catsh ?) :Ce code fonction avec le formatage que j'ai extrait mais je suis pas sur qu'il fonctionne a coup sur.
- les lignes vierge
- les lignes sans la partie valeur
- les lignes au format different (pas deux fois les deux points)
Je souhaiterai tester si le caractere au debut de la chaine restante est un espace, une tabulation ou directement l'info utile.
Va voir ici pour quelque idée : Aide Mémoire PowerShell
J'aurrais pu faire ceci :Auriez-vous une solution plus propre de faire le travail ?
[code:1]$cValue = ($_.remove(0,$_.IndexOf(\":\"«»)+1)).remove(0,($_.remove(0,$_.IndexOf(\":\"«»)+1)).IndexOf(\":\"«»)+1).TrimStart()[/code:1]
mais ce n'est qu'un exemple a partir des fonctions string disponible, pas la solution (je fais souvent mes propres fonctions)
En programmation et donc avec PowerShell, il y a souvent plusieurs techniques disponibles pour effectuer une même action, c'est ce qui permet de s'adapter au mieux à chaque situation.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 6 mois #15844
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraire une chaine de caractere
Une solution basée regex :
[code:1]
#Recherche au moins ': 13:07:31.333 UTC'+fin de chaîne
if ($s -match ':«»(?<UTC>\s*\d{2}:\d{2}:\d{2}\.\d{3} UTC.*)')
{$Matches.UTC.Trim()}
[/code:1]
[code:1]
#Recherche au moins ': 13:07:31.333 UTC'+fin de chaîne
if ($s -match ':«»(?<UTC>\s*\d{2}:\d{2}:\d{2}\.\d{3} UTC.*)')
{$Matches.UTC.Trim()}
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.067 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Extraire une chaine de caractere