Question Récupération Colonnes
- monsanto
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 29
- Remerciements reçus 0
il y a 14 ans 1 mois #11107
par monsanto
Récupération Colonnes a été créé par monsanto
Bonjour,
j'ai un soucis pour récupérer des colonnes qui m'intéresse d'un fichier .txt.
Mon fichier .txt est dans les pieces jointes.
J'aimerais récupérer La commande Name, Pid, Pri et CPU Time .
Mais le soucis c'est que entre chaque colonne l'espace est différent et aucune ponctuation les sépares c'est pour cela que j'ai un peu de mal ...
Merci de votre aide et des solutions que vous pouvez me proposez.
pierre
j'ai un soucis pour récupérer des colonnes qui m'intéresse d'un fichier .txt.
Mon fichier .txt est dans les pieces jointes.
J'aimerais récupérer La commande Name, Pid, Pri et CPU Time .
Mais le soucis c'est que entre chaque colonne l'espace est différent et aucune ponctuation les sépares c'est pour cela que j'ai un peu de mal ...
Merci de votre aide et des solutions que vous pouvez me proposez.
pierre
La pièce jointe file_txt.zip est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 968
- Remerciements reçus 0
il y a 14 ans 1 semaine #11298
par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:Récupération Colonnes
Bonjour,
Dans ton fichier texte, tu devrais déjà commencer par supprimer la ou les premières ligne afin de ne laisser en entête du fichier que le nom des colonnes, et donc des propriétés (Name, Pid, etc...).
Ce qui nous donne un début de fichier tel que :
[code:1]
Name Pid Pri Thd Hnd Priv CPU_Time Elapsed_Time
Idle 0 0 2 0 0 29:00:11.171 17:29:46.018
System 4 8 131 2447 0 0:05:09.375 17:29:46.018
smss 428 11 2 226 136 0:00:04.375 17:29:46.018
csrss 476 13 15 1020 1784 0:01:16.718 17:29:34.221
winlogon 504 13 20 546 8280 0:03:54.500 17:29:24.690
services 552 9 18 631 4656 0:00:22.078 17:29:23.159
lsass 564 9 33 1528 12144 0:03:06.375 17:29:22.909
svchost 736 8 6 105 1140 0:00:00.750 17:29:19.612[/code:1]
N.B. : Pas d'espace dans les noms de colonnes 'Elapsed_Time' et 'CPU_Time' !
Ensuite, une solution consiste à utiliser les 2 fonctions fournies dans cet article (merci JayKul
): huddledmasses.org/powershell-convert-del...-tab-delimited-text/
Attention : Il y a une coquille dans le nom de la première fonction. Convert-Delimited est plus tard appelé Convert-Delimiters.
Il faut bien écrire cette première fonction de la façon suivante :
[code:1]Function Convert-Delimiters([regex]$from,[string]$to)
{
process
{
$_ = $_ -replace \"(?:`\"((?:«»(?:[^`\"]|`\"`\"«»))+)(?:`\"$from|`\"`$))|(?:«»((?:.(?!$from))*.)(?:$from|`$))\",\"Þ`$1`$2Þ$to\"
$_ = $_ -replace \"Þ(?:$to|Þ)?`$\",\"Þ\"
$_ = $_ -replace \"`\"`\"\",\"`\"\" -replace \"`\"\",\"`\"`\"\"
$_ = $_ -replace \"Þ((?:[^Þ`\"](?!$to))+)Þ($to|`$)\",\"`$1`$2\"
$_ = $_ -replace \"Þ\",\"`\"\" -replace \"Þ\",\"`\"\"
$_
}
}[/code:1]
La seconde fonction étant :
[code:1]Function Import-Delimited([regex]$delimiter=\",\", [string]$PsPath=\"\"«»)
{
begin{
$script:tmp = [IO.Path]::GetTempFileName()
write-debug \"Using tempfile $($script:tmp)\"
Function Import-String([string]$inputString){
if($inputString.Length -gt 0 ) {
write-debug \"Importing $inputString\"
if(($inputString -as [IO.FileInfo]).Exists) {
Get-Content $inputString | Convert-Delimiters $delimiter \",\" | Add-Content $script:tmp
} elseif( ((Join-Path $pwd $inputString) -as [IO.FileInfo]).Exists) {
Get-Content (Join-Path $pwd $inputString) | Convert-Delimiters $delimiter \",\" | Add-Content $script:tmp
} else {
$inputString | Convert-Delimiters $delimiter \",\" | Add-Content $script:tmp
}
} else {
write-debug \"Nothing to Import\"
}
}
Import-String $PsPath
}
process{
Import-String $_
}
end
{
Import-Csv $script:tmp
Remove-Item $script:tmp
}
}[/code:1]
J'ai appliqué ces commandes sur ton fichier (après avoir retiré les premières lignes) :
[code:1]$InfosCPU = Get-Content \"C:\Temp\ps_meta.txt\" | Import-Delimited \" +\"[/code:1]
Comme indiqué dans l'article, le + correspond à une expression régulière (regex) qui signifie \"un ou plusieurs espaces\".
Et hop ! Je me retrouve avec une collection d'informations, via mon nouvel objet (PSObject) $InfosCPU.
[code:1]PS > $InfosCPU[0]
Name : Idle
Pid : 0
Pri : 0
Thd : 2
Hnd : 0
Priv : 0
CPU_Time : 29:00:11.171
Elapsed_Time : 17:29:46.018
[/code:1]
Dans ton cas, le mieux serait de récupérer non pas un fichier texte mais directement un fichier csv (\"Comma Separated Values\").
Exemple :
[code:1]Get-Process | Export-Csv -Path C:\Temp\cpu.csv -Delimiter \";\" -NoTypeInformation
[/code:1]
Simple ensuite de récupérer ces informations :
[code:1]$InfosCPU = Import-Csv C:\Temp\cpu.csv -Delimiter \";\"
[/code:1]
@+
Matthew<br><br>Message édité par: Matthew BETTON, à: 12/03/12 22:09
Dans ton fichier texte, tu devrais déjà commencer par supprimer la ou les premières ligne afin de ne laisser en entête du fichier que le nom des colonnes, et donc des propriétés (Name, Pid, etc...).
Ce qui nous donne un début de fichier tel que :
[code:1]
Name Pid Pri Thd Hnd Priv CPU_Time Elapsed_Time
Idle 0 0 2 0 0 29:00:11.171 17:29:46.018
System 4 8 131 2447 0 0:05:09.375 17:29:46.018
smss 428 11 2 226 136 0:00:04.375 17:29:46.018
csrss 476 13 15 1020 1784 0:01:16.718 17:29:34.221
winlogon 504 13 20 546 8280 0:03:54.500 17:29:24.690
services 552 9 18 631 4656 0:00:22.078 17:29:23.159
lsass 564 9 33 1528 12144 0:03:06.375 17:29:22.909
svchost 736 8 6 105 1140 0:00:00.750 17:29:19.612[/code:1]
N.B. : Pas d'espace dans les noms de colonnes 'Elapsed_Time' et 'CPU_Time' !
Ensuite, une solution consiste à utiliser les 2 fonctions fournies dans cet article (merci JayKul
Attention : Il y a une coquille dans le nom de la première fonction. Convert-Delimited est plus tard appelé Convert-Delimiters.
Il faut bien écrire cette première fonction de la façon suivante :
[code:1]Function Convert-Delimiters([regex]$from,[string]$to)
{
process
{
$_ = $_ -replace \"(?:`\"((?:«»(?:[^`\"]|`\"`\"«»))+)(?:`\"$from|`\"`$))|(?:«»((?:.(?!$from))*.)(?:$from|`$))\",\"Þ`$1`$2Þ$to\"
$_ = $_ -replace \"Þ(?:$to|Þ)?`$\",\"Þ\"
$_ = $_ -replace \"`\"`\"\",\"`\"\" -replace \"`\"\",\"`\"`\"\"
$_ = $_ -replace \"Þ((?:[^Þ`\"](?!$to))+)Þ($to|`$)\",\"`$1`$2\"
$_ = $_ -replace \"Þ\",\"`\"\" -replace \"Þ\",\"`\"\"
$_
}
}[/code:1]
La seconde fonction étant :
[code:1]Function Import-Delimited([regex]$delimiter=\",\", [string]$PsPath=\"\"«»)
{
begin{
$script:tmp = [IO.Path]::GetTempFileName()
write-debug \"Using tempfile $($script:tmp)\"
Function Import-String([string]$inputString){
if($inputString.Length -gt 0 ) {
write-debug \"Importing $inputString\"
if(($inputString -as [IO.FileInfo]).Exists) {
Get-Content $inputString | Convert-Delimiters $delimiter \",\" | Add-Content $script:tmp
} elseif( ((Join-Path $pwd $inputString) -as [IO.FileInfo]).Exists) {
Get-Content (Join-Path $pwd $inputString) | Convert-Delimiters $delimiter \",\" | Add-Content $script:tmp
} else {
$inputString | Convert-Delimiters $delimiter \",\" | Add-Content $script:tmp
}
} else {
write-debug \"Nothing to Import\"
}
}
Import-String $PsPath
}
process{
Import-String $_
}
end
{
Import-Csv $script:tmp
Remove-Item $script:tmp
}
}[/code:1]
J'ai appliqué ces commandes sur ton fichier (après avoir retiré les premières lignes) :
[code:1]$InfosCPU = Get-Content \"C:\Temp\ps_meta.txt\" | Import-Delimited \" +\"[/code:1]
Comme indiqué dans l'article, le + correspond à une expression régulière (regex) qui signifie \"un ou plusieurs espaces\".
Et hop ! Je me retrouve avec une collection d'informations, via mon nouvel objet (PSObject) $InfosCPU.
[code:1]PS > $InfosCPU[0]
Name : Idle
Pid : 0
Pri : 0
Thd : 2
Hnd : 0
Priv : 0
CPU_Time : 29:00:11.171
Elapsed_Time : 17:29:46.018
[/code:1]
Dans ton cas, le mieux serait de récupérer non pas un fichier texte mais directement un fichier csv (\"Comma Separated Values\").
Exemple :
[code:1]Get-Process | Export-Csv -Path C:\Temp\cpu.csv -Delimiter \";\" -NoTypeInformation
[/code:1]
Simple ensuite de récupérer ces informations :
[code:1]$InfosCPU = Import-Csv C:\Temp\cpu.csv -Delimiter \";\"
[/code:1]
@+
Matthew<br><br>Message édité par: Matthew BETTON, à: 12/03/12 22:09
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.080 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Récupération Colonnes