Question
[Résolu] Parsing de fichier par blocs
- jojo
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 187
- Remerciements reçus 0
il y a 16 ans 2 semaines #6302
par jojo
[Résolu] Parsing de fichier par blocs a été créé par jojo
Bonjour mes amis powershelleurs, 
je suis nouveau dans la programmation et j'aime ce que vous faites, c'est mes premier pas dans ce merveilleux monde de powershell..
j'ai un problème de parsing de fichiers: voici l'explication
j'ai un fichier bloc.ht qui a cette structure:
[code:1]BLOCK 1 {
run = xxxxxxx
load = xxxxxx
first = 54455
last = 74487
}
first = 01
last = 02
BLOCK 2 {
load = xxxxx
first = 144
last = 35454
}
first = 03
last = 04
BLOCK 3 {
last = 8749
run = xxxxxx
first = 5471
}
..etc[/code:1]
comme vous voyez il s'agit d'une séquence de blocs chaque bloc contient des données, je voudrais créer un fichier all_block.ht contenant:
[code:1]BLOCK:1 54455 74487
BLOCK:2 144 35454
BLOCK:3 5471 8749
[/code:1]
c-à-d
BLOCK: x valeur_de_first valeur_de_last
j'ai essayer d'utiliser un SELECT pour selectionner toutes les \"first\" et \"last\" mais c'est pas gagné.. y a t'il une commande qui peux selectionner des blocs
si quelqu'un à une idée je suis preneur, merci<br><br>Message édité par: Arnaud, à: 11/03/10 09:09
je suis nouveau dans la programmation et j'aime ce que vous faites, c'est mes premier pas dans ce merveilleux monde de powershell..
j'ai un problème de parsing de fichiers: voici l'explication
j'ai un fichier bloc.ht qui a cette structure:
[code:1]BLOCK 1 {
run = xxxxxxx
load = xxxxxx
first = 54455
last = 74487
}
first = 01
last = 02
BLOCK 2 {
load = xxxxx
first = 144
last = 35454
}
first = 03
last = 04
BLOCK 3 {
last = 8749
run = xxxxxx
first = 5471
}
..etc[/code:1]
comme vous voyez il s'agit d'une séquence de blocs chaque bloc contient des données, je voudrais créer un fichier all_block.ht contenant:
[code:1]BLOCK:1 54455 74487
BLOCK:2 144 35454
BLOCK:3 5471 8749
[/code:1]
c-à-d
BLOCK: x valeur_de_first valeur_de_last
j'ai essayer d'utiliser un SELECT pour selectionner toutes les \"first\" et \"last\" mais c'est pas gagné.. y a t'il une commande qui peux selectionner des blocs
si quelqu'un à une idée je suis preneur, merci<br><br>Message édité par: Arnaud, à: 11/03/10 09:09
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 16 ans 2 semaines #6306
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:parsing de fichier par blocs
Salut,
un premier jet :
[code:1]
$First=$false
$last=$false
$o=$null
switch -regex -file \"c:\temp\block.txt\"
{
\"Block ([0-9]+) {\"
{
if ($o -eq $null)
{
$o=\"Block:$($Matches[1])\"
}
else
{
$o;
$o=\"Block:$($Matches[1])\"
$First=$false
$last=$false
}
}
\"first = ([0-9]+)\"
{
if (!$First)
{
$o+=\" $($Matches[1])\"
$First=$true
}
}
\"last = ([0-9]+)\"
{
if (!$last)
{
$o+=\" $($Matches[1])\"
$last=$true
}
}
}
#émet le dernier
$o
[/code:1]
Mais cela ne répond pas à ton pb, car la structure n'est pas constante.
Reste à déterminer quand le champ first est précisé en premier et quand il ne l'est pas.
J'aime bien cette \"coerrance\"
<br><br>Message édité par: Laurent Dardenne, à: 4/03/10 20:54
un premier jet :
[code:1]
$First=$false
$last=$false
$o=$null
switch -regex -file \"c:\temp\block.txt\"
{
\"Block ([0-9]+) {\"
{
if ($o -eq $null)
{
$o=\"Block:$($Matches[1])\"
}
else
{
$o;
$o=\"Block:$($Matches[1])\"
$First=$false
$last=$false
}
}
\"first = ([0-9]+)\"
{
if (!$First)
{
$o+=\" $($Matches[1])\"
$First=$true
}
}
\"last = ([0-9]+)\"
{
if (!$last)
{
$o+=\" $($Matches[1])\"
$last=$true
}
}
}
#émet le dernier
$o
[/code:1]
Mais cela ne répond pas à ton pb, car la structure n'est pas constante.
Reste à déterminer quand le champ first est précisé en premier et quand il ne l'est pas.
J'aime bien cette \"coerrance\"
Tutoriels PowerShell
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 16 ans 2 semaines #6312
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:parsing de fichier par blocs
Une solution :
[code:1]
$H=@{Block=$null;First=$null;Last=$null}
$First=$false
$Last=$false
switch -regex -file \"c:\temp\block.txt\"
{
\"Block ([0-9]+) {\"
{
if ($H.Block -eq $null)
{ $H.Block=\"Block:$($Matches[1])\" }
else
{
\"$($H.Block)$($H.First)$($H.Last)\"
$H=@{Block=\"Block:$($Matches[1])\";First=$null;Last=$null}
$First=$false
$Last=$false
}
}
\"first = ([0-9]+)\"
{
if (!$First)
{
$H.First=\" $($Matches[1])\"
$First=$true
}
}
\"last = ([0-9]+)\"
{
if (!$last)
{
$H.Last=\" $($Matches[1])\"
$Last=$true
}
}
}
#émet le dernier
\"$($H.Block)$($H.First)$($H.Last)\"
#Block:1 54455 74487
#Block:2 144 35454
#Block:3 5471 8749
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 6/03/10 13:11
[code:1]
$H=@{Block=$null;First=$null;Last=$null}
$First=$false
$Last=$false
switch -regex -file \"c:\temp\block.txt\"
{
\"Block ([0-9]+) {\"
{
if ($H.Block -eq $null)
{ $H.Block=\"Block:$($Matches[1])\" }
else
{
\"$($H.Block)$($H.First)$($H.Last)\"
$H=@{Block=\"Block:$($Matches[1])\";First=$null;Last=$null}
$First=$false
$Last=$false
}
}
\"first = ([0-9]+)\"
{
if (!$First)
{
$H.First=\" $($Matches[1])\"
$First=$true
}
}
\"last = ([0-9]+)\"
{
if (!$last)
{
$H.Last=\" $($Matches[1])\"
$Last=$true
}
}
}
#émet le dernier
\"$($H.Block)$($H.First)$($H.Last)\"
#Block:1 54455 74487
#Block:2 144 35454
#Block:3 5471 8749
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 6/03/10 13:11
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- jojo
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 187
- Remerciements reçus 0
il y a 16 ans 2 semaines #6315
par jojo
Réponse de jojo sur le sujet Re:parsing de fichier par blocs
çà marche !! 
c'est génial, merci Laurent..la seule chose qui ne marche pas c'est mon cerveau: je n'ai rien compris de ton script
c'est génial, merci Laurent..la seule chose qui ne marche pas c'est mon cerveau: je n'ai rien compris de ton script
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 16 ans 1 semaine #6316
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:parsing de fichier par blocs
jojo écrit:

[code:1]
#Hashtable permettant de réorganiser les chaînes first et last
$H=@{Block=$null;First=$null;Last=$null}
#Pour chaque block on ne prend que la première occurence de first et last
$First=$false
$Last=$false
#On parcourt le fichier ligne par ligne
#Le résultat doit correspondre à une des expressions régulières
switch -regex -file \"c:\temp\block.txt\"
{
# Regex : on recherche le mot block suivi :
#d'un espace et de un ou plusieurs chiffres ([0-9]+)
\"Block ([0-9]+) {\"
{
#La clé Block à null indique le début du parcourt des lignes
if ($H.Block -eq $null)
#$Matches[1] correspond au nombre accolé au mot 'Block'
{ $H.Block=\"Block:$($Matches[1])\" }
else
{
#Sinon c'est une nouvelle occurence de 'Block'
#Tous les champs de la hashtable sont renseignés
\"$($H.Block)$($H.First)$($H.Last)\"
#Bis repetita placent :«»-)
$H=@{Block=\"Block:$($Matches[1])\";First=$null;Last=$null}
$First=$false
$Last=$false
}
}
\"first = ([0-9]+)\"
{
#Si c'est la première occurence de first
#on sauvegarde le nombre associé
if (!$First)
{
$H.First=\" $($Matches[1])\"
#on évite de traiter la suivante pour le block courant
$First=$true
}
}
\"last = ([0-9]+)\"
{
#idem
if (!$last)
{
$H.Last=\" $($Matches[1])\"
$Last=$true
}
}
}
#émet le dernier
\"$($H.Block)$($H.First)$($H.Last)\"
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 8/03/10 13:04
Avec des commentaires c'est plus mieuxje n'ai rien compris de ton script
![]()
[code:1]
#Hashtable permettant de réorganiser les chaînes first et last
$H=@{Block=$null;First=$null;Last=$null}
#Pour chaque block on ne prend que la première occurence de first et last
$First=$false
$Last=$false
#On parcourt le fichier ligne par ligne
#Le résultat doit correspondre à une des expressions régulières
switch -regex -file \"c:\temp\block.txt\"
{
# Regex : on recherche le mot block suivi :
#d'un espace et de un ou plusieurs chiffres ([0-9]+)
\"Block ([0-9]+) {\"
{
#La clé Block à null indique le début du parcourt des lignes
if ($H.Block -eq $null)
#$Matches[1] correspond au nombre accolé au mot 'Block'
{ $H.Block=\"Block:$($Matches[1])\" }
else
{
#Sinon c'est une nouvelle occurence de 'Block'
#Tous les champs de la hashtable sont renseignés
\"$($H.Block)$($H.First)$($H.Last)\"
#Bis repetita placent :«»-)
$H=@{Block=\"Block:$($Matches[1])\";First=$null;Last=$null}
$First=$false
$Last=$false
}
}
\"first = ([0-9]+)\"
{
#Si c'est la première occurence de first
#on sauvegarde le nombre associé
if (!$First)
{
$H.First=\" $($Matches[1])\"
#on évite de traiter la suivante pour le block courant
$First=$true
}
}
\"last = ([0-9]+)\"
{
#idem
if (!$last)
{
$H.Last=\" $($Matches[1])\"
$Last=$true
}
}
}
#émet le dernier
\"$($H.Block)$($H.First)$($H.Last)\"
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 8/03/10 13:04
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.050 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Parsing de fichier par blocs