Question
Extraction de donnée
- Paporalkis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 6 ans 9 mois #29008
par Paporalkis
Extraction de donnée a été créé par Paporalkis
Bonjour à tous,
Je tien a signaler mon niveau qui est proche de zero en powershell.
Je n'ai malheureusement pas trouver ce que je recherche sur le net, que ce soit avec excel, java ou powershell.
Mon problème est le suivant, j'aiun fichier avec des données du style
titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2:titre de la donnée 3:donnée 3
titre de la donnée 1:donnée 1
titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2
titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2:titre de la donnée 3:donnée 3
Comme vous le remarquez il n'y a pas toujours les 3 données d'indiquées.
Je souhaite extraire les données affin de pouvoir créer un tableau
titre de donné 1 | titre de donnée 2
donnée 1 | donnée 2
Pas besoin de la donnée 3
Pour corsé un peut la chose j'ai plusieurs fichier et le nombre de ligne est différente pour chacun
Voila qu'elque aurait il qqu'elque chose qui puissent me faire ce henre d'extraction ?
Merci a tous.
Je tien a signaler mon niveau qui est proche de zero en powershell.
Je n'ai malheureusement pas trouver ce que je recherche sur le net, que ce soit avec excel, java ou powershell.
Mon problème est le suivant, j'aiun fichier avec des données du style
titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2:titre de la donnée 3:donnée 3
titre de la donnée 1:donnée 1
titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2
titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2:titre de la donnée 3:donnée 3
Comme vous le remarquez il n'y a pas toujours les 3 données d'indiquées.
Je souhaite extraire les données affin de pouvoir créer un tableau
titre de donné 1 | titre de donnée 2
donnée 1 | donnée 2
Pas besoin de la donnée 3
Pour corsé un peut la chose j'ai plusieurs fichier et le nombre de ligne est différente pour chacun
Voila qu'elque aurait il qqu'elque chose qui puissent me faire ce henre d'extraction ?
Merci a tous.
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 6 ans 9 mois #29009
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraction de donnée
Salut,
une piste rapido :
[code:1]
#découpe la ligne: Nom, Valeur
# Via -split, Nom a un index pair et Valeur un index impaire
#La clé précède la valeur
$s='titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2:titre de la donnée 3:donnée 3'
$t=$s -split ':'
#une hashtable contenant en clé les noms des valeurs et en donnée un tableau de valeurs
$h=@{}
$Count=$T.Count-1
Foreach ($index in 0..$Count)
{
if ( ($Index % 2) -eq 0)
{
#Paire, on ajoute une clé si elle n'existe pas
$key=$T[$Index]
if (-not $h.Contains($Key) )
{ $h.Add( $key , ([System.Collections.ArrayList]::new() )) }
}
else
{
#Impaire, on complète la tableau associé à la clé précédente
$value=$T[$Index]
$h.$Key.Add($Value) > $null
}
}
$H
# Name Value
# ----
# titre de la donnée 1 {donnée 1}
# titre de la donnée 3 {donnée 3}
# titre de la donnée 2 {donnée 2}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 12/06/19 10:36
une piste rapido :
[code:1]
#découpe la ligne: Nom, Valeur
# Via -split, Nom a un index pair et Valeur un index impaire
#La clé précède la valeur
$s='titre de la donnée 1:donnée 1:titre de la donnée 2:donnée 2:titre de la donnée 3:donnée 3'
$t=$s -split ':'
#une hashtable contenant en clé les noms des valeurs et en donnée un tableau de valeurs
$h=@{}
$Count=$T.Count-1
Foreach ($index in 0..$Count)
{
if ( ($Index % 2) -eq 0)
{
#Paire, on ajoute une clé si elle n'existe pas
$key=$T[$Index]
if (-not $h.Contains($Key) )
{ $h.Add( $key , ([System.Collections.ArrayList]::new() )) }
}
else
{
#Impaire, on complète la tableau associé à la clé précédente
$value=$T[$Index]
$h.$Key.Add($Value) > $null
}
}
$H
# Name Value
# ----
# titre de la donnée 1 {donnée 1}
# titre de la donnée 3 {donnée 3}
# titre de la donnée 2 {donnée 2}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 12/06/19 10:36
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Paporalkis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 6 ans 9 mois #29010
par Paporalkis
Réponse de Paporalkis sur le sujet Re:Extraction de donnée
Merci je vais jeter un œil:)
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 6 ans 9 mois #29011
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraction de donnée
Il y avait une coquille dans le code que j'ai corrigé.
Je pense que cette approche est incomplète car on ne peut reconstruire les objets constituant le tableau d'origine.
On ne sait plus à quelle ligne correspond les données
Ensuite, pour aller plus loin il faut bien plus de détails sur la structure a analyser et ce qu'elle peuvent contenir.
par exemple est-ce que je peux avoir ceci :
[code:1]
$s=@'
titre de la donnée 1:donnée A1
titre de la donnée 1:donnée A2:titre de la donnée 2:donnée B1
titre de la donnée 1:donnée A3:titre de la donnée 2:donnée B2:titre de la donnée 3:donnée C1
'@
[/code:1]
On connait le nb de 'colonne' en fin de parsing.
Ou cela
[code:1]
$s=@'
titre de la donnée 2:donnée B1:titre de la donnée 3:donnée C1
titre de la donnée 3:donnée C2
'@
[/code:1]
Tous les noms de colonnes ne sont pas précisés.
Et les mots constituant le nom et la valeur peuvent-ils contenir tous les caractères (espace,apostrophe, guillemet, tiret, etc) ?
Je pense que cette approche est incomplète car on ne peut reconstruire les objets constituant le tableau d'origine.
On ne sait plus à quelle ligne correspond les données
Ensuite, pour aller plus loin il faut bien plus de détails sur la structure a analyser et ce qu'elle peuvent contenir.
par exemple est-ce que je peux avoir ceci :
[code:1]
$s=@'
titre de la donnée 1:donnée A1
titre de la donnée 1:donnée A2:titre de la donnée 2:donnée B1
titre de la donnée 1:donnée A3:titre de la donnée 2:donnée B2:titre de la donnée 3:donnée C1
'@
[/code:1]
On connait le nb de 'colonne' en fin de parsing.
Ou cela
[code:1]
$s=@'
titre de la donnée 2:donnée B1:titre de la donnée 3:donnée C1
titre de la donnée 3:donnée C2
'@
[/code:1]
Tous les noms de colonnes ne sont pas précisés.
Et les mots constituant le nom et la valeur peuvent-ils contenir tous les caractères (espace,apostrophe, guillemet, tiret, etc) ?
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 6 ans 9 mois #29023
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraction de donnée
Le sujet étant un peu retors je continu ma réflexion, une autre approche :
[code:1]
$s=@'
titre de la donnée 1:donnée A1
titre de la donnée 1:donnée A2:titre de la donnée 2:donnée B1
titre de la donnée 1:donnée A3:titre de la donnée 2:donnée B2:titre de la donnée 3:donnée C1
'@
#découpe les lignes sauf si on utilise Get-Content car on obtient déjà un tableau de lignes
$Lignes=$S -split \"`r`n|`n\"
$Objets=Foreach ($ligne in $Lignes)
{
$T=$ligne -split ':'
$H=@{}
While( $null -ne $T)
{
$Nom,$Valeur,$T=$T #Affectation multiple, $T contient le reste ($T moins les -2 éléments affectée)
$H.$Nom=$Valeur
}
[pscustomObject]$H
}
$Objets
# titre de la donnée 1
#
# donnée A1
# donnée A2
# donnée A3
$Objets[0]
# titre de la donnée 1
#
# donnée A1
$Objets[1]
# titre de la donnée 2 titre de la donnée 1
#
# donnée B1 donnée A2
$Objets[2]
# titre de la donnée 1 titre de la donnée 3 titre de la donnée 2
#
# donnée A3 donnée C1 donnée B2
[/code:1]
Ensuite l'export rencontre un problème car son traitement se base sur la structure du premier objet émit dans le pipeline :
[code:1]$Objets|export-csv c:\temp\t.csv -Encoding UTF8 -NoTypeInformation
type c:\temp\t.csv
# \"titre de la donnée 1\"
# \"donnée A1\"
# \"donnée A2\"
# \"donnée A3\"[/code:1]
Il en manque un bout
On doit donc connaitre, si c'est nécessaire dans ton cas, le nb max de propriété(champs/colonne) pour créer un tableau d'objet identique mais dont ses éléments pourront avoir certaines propriétés à $null.
[code:1]
$s=@'
titre de la donnée 1:donnée A1
titre de la donnée 1:donnée A2:titre de la donnée 2:donnée B1
titre de la donnée 1:donnée A3:titre de la donnée 2:donnée B2:titre de la donnée 3:donnée C1
'@
#découpe les lignes sauf si on utilise Get-Content car on obtient déjà un tableau de lignes
$Lignes=$S -split \"`r`n|`n\"
$Objets=Foreach ($ligne in $Lignes)
{
$T=$ligne -split ':'
$H=@{}
While( $null -ne $T)
{
$Nom,$Valeur,$T=$T #Affectation multiple, $T contient le reste ($T moins les -2 éléments affectée)
$H.$Nom=$Valeur
}
[pscustomObject]$H
}
$Objets
# titre de la donnée 1
#
# donnée A1
# donnée A2
# donnée A3
$Objets[0]
# titre de la donnée 1
#
# donnée A1
$Objets[1]
# titre de la donnée 2 titre de la donnée 1
#
# donnée B1 donnée A2
$Objets[2]
# titre de la donnée 1 titre de la donnée 3 titre de la donnée 2
#
# donnée A3 donnée C1 donnée B2
[/code:1]
Ensuite l'export rencontre un problème car son traitement se base sur la structure du premier objet émit dans le pipeline :
[code:1]$Objets|export-csv c:\temp\t.csv -Encoding UTF8 -NoTypeInformation
type c:\temp\t.csv
# \"titre de la donnée 1\"
# \"donnée A1\"
# \"donnée A2\"
# \"donnée A3\"[/code:1]
Il en manque un bout
On doit donc connaitre, si c'est nécessaire dans ton cas, le nb max de propriété(champs/colonne) pour créer un tableau d'objet identique mais dont ses éléments pourront avoir certaines propriétés à $null.
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 6 ans 9 mois #29024
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraction de donnée
Une solution, sous réserve de tests :
[code:1]
Function New-PSCustomObjectFunction {
#crée une fonction génèrant un objet personnalisé simple
#tous ses paramètres sont obligatoires et ne sont pas typé
#
# Par défaut génère du code sans la signature du mot clé Function
# Le paramètre -FILE génére du code avec la signature du mot clé Function
param(
[Parameter(Mandatory=$true,position=0)]
[ValidateNotNullOrEmpty()]
$Noun,
[Parameter(Mandatory=$true,position=1)]
[ValidateNotNullOrEmpty()]
[String[]]$Parameters,
[switch] $File
)
$ofs=' '
$Borne=$Parameters.count-1
$code=@\"
$(if ($File) {\"Function New-$Noun{\"})
param(
$(For ($I=0;$I -le $Borne;$I++)
{ $Name=$Parameters[$I]
@\"
`t [Parameter()]
`t`$${Name}$(if ($I -Ne $borne) {\",`r`n\"})
\"@
}
)
)
$(
\"`r`n [pscustomobject]@{`r`n\"
\" PSTypeName='$Noun';\"
$( $Parameters|
ForEach-Object {
\"`r`n {0}=`${1};\" -F $_,$_
}
)
\"`r`n }\"
)
$(if ($File) {\"`r`n}# New-$Noun\"})
\"@
$Code
}#New-PSCustomObjectFunction
function Replace{
param($name)
$name -replace ' ','_'
}
$s=@'
titre de la donnée 1:donnée A1
titre de la donnée 1:donnée A2:titre de la donnée 2:donnée B1
titre de la donnée 1:donnée A3:titre de la donnée 2:donnée B2:titre de la donnée 3:donnée C1
'@
#découpe les lignes sauf si on utilise Get-Content car on obtient déjà un tableau de lignes
$Lignes=$S -split \"`r`n|`n\"
#Mémorise la ligne ayant le plus de définition de colonne/pripriétés
$HashTableWithMaxProperties=@{}
$DefinitionObjets=Foreach ($ligne in $Lignes)
{
$T=$ligne -split ':'
$Hashtable=@{}
While( $null -ne $T)
{
#Affectation multiple, $T contient le reste ($T moins les -2 éléments affectée)
$Nom,$Valeur,$T=$T
#Dans le nom de propriété on remplace les espaces par des tirets
$Hashtable.$(Replace $Nom)=$Valeur
}
if ($Hashtable.Keys.count -gt $HashTableWithMaxProperties.Keys.Count)
{$HashTableWithMaxProperties=$Hashtable}
#Emet une hastable représentant un objet
$Hashtable
}
#On crée dynamiquement une fonction afin de créer des objets de même structure
#l'usage de [PSCustomObject]$H est insuffisant ici
$Name=\"MyObject\"
New-PSCustomObjectFunction $Name -Parameters $HashTableWithMaxProperties.Keys |
Set-Item Function:\"New-$Name\" -Force
$result=Foreach($Structure in $DefinitionObjets)
{
#on utilise le splating qui paramètre la fonction à l'aide d'une hashtable
New-MyObject @Structure
}
$Result
# titre_de_la_donnée_1 titre_de_la_donnée_2 titre_de_la_donnée_3
#
# donnée A1
# donnée A2 donnée B1
# donnée A3 donnée B2 donnée C1
$Result|export-csv c:\temp\t.csv -Encoding UTF8 -NoTypeInformation
type c:\temp\t.csv
# \"titre_de_la_donnée_1\",\"titre_de_la_donnée_2\",\"titre_de_la_donnée_3\"
# \"donnée A1\",,
# \"donnée A2\",\"donnée B1\",
# \"donnée A3\",\"donnée B2\",\"donnée C1\"
[/code:1]
[code:1]
Function New-PSCustomObjectFunction {
#crée une fonction génèrant un objet personnalisé simple
#tous ses paramètres sont obligatoires et ne sont pas typé
#
# Par défaut génère du code sans la signature du mot clé Function
# Le paramètre -FILE génére du code avec la signature du mot clé Function
param(
[Parameter(Mandatory=$true,position=0)]
[ValidateNotNullOrEmpty()]
$Noun,
[Parameter(Mandatory=$true,position=1)]
[ValidateNotNullOrEmpty()]
[String[]]$Parameters,
[switch] $File
)
$ofs=' '
$Borne=$Parameters.count-1
$code=@\"
$(if ($File) {\"Function New-$Noun{\"})
param(
$(For ($I=0;$I -le $Borne;$I++)
{ $Name=$Parameters[$I]
@\"
`t [Parameter()]
`t`$${Name}$(if ($I -Ne $borne) {\",`r`n\"})
\"@
}
)
)
$(
\"`r`n [pscustomobject]@{`r`n\"
\" PSTypeName='$Noun';\"
$( $Parameters|
ForEach-Object {
\"`r`n {0}=`${1};\" -F $_,$_
}
)
\"`r`n }\"
)
$(if ($File) {\"`r`n}# New-$Noun\"})
\"@
$Code
}#New-PSCustomObjectFunction
function Replace{
param($name)
$name -replace ' ','_'
}
$s=@'
titre de la donnée 1:donnée A1
titre de la donnée 1:donnée A2:titre de la donnée 2:donnée B1
titre de la donnée 1:donnée A3:titre de la donnée 2:donnée B2:titre de la donnée 3:donnée C1
'@
#découpe les lignes sauf si on utilise Get-Content car on obtient déjà un tableau de lignes
$Lignes=$S -split \"`r`n|`n\"
#Mémorise la ligne ayant le plus de définition de colonne/pripriétés
$HashTableWithMaxProperties=@{}
$DefinitionObjets=Foreach ($ligne in $Lignes)
{
$T=$ligne -split ':'
$Hashtable=@{}
While( $null -ne $T)
{
#Affectation multiple, $T contient le reste ($T moins les -2 éléments affectée)
$Nom,$Valeur,$T=$T
#Dans le nom de propriété on remplace les espaces par des tirets
$Hashtable.$(Replace $Nom)=$Valeur
}
if ($Hashtable.Keys.count -gt $HashTableWithMaxProperties.Keys.Count)
{$HashTableWithMaxProperties=$Hashtable}
#Emet une hastable représentant un objet
$Hashtable
}
#On crée dynamiquement une fonction afin de créer des objets de même structure
#l'usage de [PSCustomObject]$H est insuffisant ici
$Name=\"MyObject\"
New-PSCustomObjectFunction $Name -Parameters $HashTableWithMaxProperties.Keys |
Set-Item Function:\"New-$Name\" -Force
$result=Foreach($Structure in $DefinitionObjets)
{
#on utilise le splating qui paramètre la fonction à l'aide d'une hashtable
New-MyObject @Structure
}
$Result
# titre_de_la_donnée_1 titre_de_la_donnée_2 titre_de_la_donnée_3
#
# donnée A1
# donnée A2 donnée B1
# donnée A3 donnée B2 donnée C1
$Result|export-csv c:\temp\t.csv -Encoding UTF8 -NoTypeInformation
type c:\temp\t.csv
# \"titre_de_la_donnée_1\",\"titre_de_la_donnée_2\",\"titre_de_la_donnée_3\"
# \"donnée A1\",,
# \"donnée A2\",\"donnée B1\",
# \"donnée A3\",\"donnée B2\",\"donnée C1\"
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.052 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Extraction de donnée