Question [Résolu] Parsing de fichier par blocs

Plus d'informations
il y a 16 ans 2 semaines #6302 par jojo
Bonjour mes amis powershelleurs, :P

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.

Plus d'informations
il y a 16 ans 2 semaines #6306 par Laurent Dardenne
Salut,
un premier jet :
[code:1]
$First=$false
$last=$false
$o=$null
switch -regex -file \&quot;c:\temp\block.txt\&quot;
{
\&quot;Block ([0-9]+) {\&quot;
{
if ($o -eq $null)
{
$o=\&quot;Block:$($Matches[1])\&quot;
}
else
{
$o;
$o=\&quot;Block:$($Matches[1])\&quot;
$First=$false
$last=$false
}
}
\&quot;first = ([0-9]+)\&quot;
{
if (!$First)
{
$o+=\&quot; $($Matches[1])\&quot;
$First=$true
}
}
\&quot;last = ([0-9]+)\&quot;
{
if (!$last)
{
$o+=\&quot; $($Matches[1])\&quot;
$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 \&quot;coerrance\&quot; :silly:<br><br>Message édité par: Laurent Dardenne, à: 4/03/10 20:54

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 2 semaines #6312 par Laurent Dardenne
Une solution :
[code:1]
$H=@{Block=$null;First=$null;Last=$null}
$First=$false
$Last=$false
switch -regex -file \&quot;c:\temp\block.txt\&quot;
{
\&quot;Block ([0-9]+) {\&quot;
{
if ($H.Block -eq $null)
{ $H.Block=\&quot;Block:$($Matches[1])\&quot; }
else
{
\&quot;$($H.Block)$($H.First)$($H.Last)\&quot;
$H=@{Block=\&quot;Block:$($Matches[1])\&quot;;First=$null;Last=$null}
$First=$false
$Last=$false
}
}
\&quot;first = ([0-9]+)\&quot;
{
if (!$First)
{
$H.First=\&quot; $($Matches[1])\&quot;
$First=$true
}
}
\&quot;last = ([0-9]+)\&quot;
{
if (!$last)
{
$H.Last=\&quot; $($Matches[1])\&quot;
$Last=$true
}
}
}
#émet le dernier
\&quot;$($H.Block)$($H.First)$($H.Last)\&quot;

#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.

Plus d'informations
il y a 16 ans 2 semaines #6315 par jojo
Réponse de jojo sur le sujet Re:parsing de fichier par blocs
çà marche !! :woohoo:

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 :whistle: :blush:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 semaine #6316 par Laurent Dardenne
jojo écrit:

je n'ai rien compris de ton script :whistle: :blush:

Avec des commentaires c'est plus mieux :P

[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 \&quot;c:\temp\block.txt\&quot;
{
# Regex : on recherche le mot block suivi :
#d'un espace et de un ou plusieurs chiffres ([0-9]+)
\&quot;Block ([0-9]+) {\&quot;
{
#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=\&quot;Block:$($Matches[1])\&quot; }
else
{
#Sinon c'est une nouvelle occurence de 'Block'
#Tous les champs de la hashtable sont renseignés
\&quot;$($H.Block)$($H.First)$($H.Last)\&quot;
#Bis repetita placent :«»-)
$H=@{Block=\&quot;Block:$($Matches[1])\&quot;;First=$null;Last=$null}
$First=$false
$Last=$false
}
}
\&quot;first = ([0-9]+)\&quot;
{
#Si c'est la première occurence de first
#on sauvegarde le nombre associé
if (!$First)
{
$H.First=\&quot; $($Matches[1])\&quot;
#on évite de traiter la suivante pour le block courant
$First=$true
}
}
\&quot;last = ([0-9]+)\&quot;
{
#idem
if (!$last)
{
$H.Last=\&quot; $($Matches[1])\&quot;
$Last=$true
}
}
}
#émet le dernier
\&quot;$($H.Block)$($H.First)$($H.Last)\&quot;
[/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
Propulsé par Kunena