Question [Fonction] Import-FixedLength
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 11 ans 10 mois #13788
par Laurent Dardenne
Tutoriels PowerShell
[Fonction] Import-FixedLength a été créé par Laurent Dardenne
Voici une fonction de gestion de fichier texte contenant des enregistrements de longueur fixe :
[code:1]
function Import-FixedLength {
#Adapté de gallery.technet.microsoft.com/scriptcent...d3-8e4a-63f4e0d3735f
# $FieldWidths=@(5,15,-1) # Longeur des champs, -1 indique un champ de longueur variable
Param (
[string] $File,
[string[]] $FieldNames,
[int[]] $FieldWidths,
[ScriptBlock] $NewObject,
[switch] $PreserveWhiteSpace
)
Add-type -AssemblyName 'Microsoft.VisualBasic'
$Parser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($File)
$Parser.TextFieldType = 'FixedWidth'
#Par défaut on supprime les espaces en début et en fin de champ
$Parser.TrimWhiteSpace = -Not $PreserveWhiteSpace
$Parser.FieldWidths = $FieldWidths
while(!$Parser.EndOfData)
{
try
{
$CurrentRow = $Parser.ReadFields()
&$NewObject @CurrentRow
}
catch [Microsoft.VisualBasic.FileIO.MalformedLineException]
{ Write-Host \"Error, line $($_.Exception.LineNumber): $($Parser.ErrorLine)\" }
}
} #Import-FixedLength
[/code:1]
Pour le test on réutilise l'existant New-PSCustomObjectFunction et dans le code de la fonction on s'appuie sur le splatting .
[code:1]
#On nomme les champs, ces noms sont utilisés
#lors de la génération de la fonction créant des objets
# à partir des données importées.
$FieldNames=ql Numéro Nom Prénom Roles
#Pour l'import
$FieldWidths=@(5,13,18,-1)
#créer une fonction spécialisée
$FunctionFile='C:\Temp\New-MonObjet.ps1'
$Code=New-PSCustomObjectFunction 'MonObjet' $FieldNames -File
$Code|
Set-Content $FunctionFile
#Charge la fonction
.\"$FunctionFile\"
#Affiche son code, la présence du caractére '-' oblige cette syntaxe
${function:New-MonObjet}
Function ql {$args}
$function:ql
$FileTest=\"C:\temp\TestFixedLength.txt\"
@\"
1 Nom1 prénom avec espace Role1,Role2,Role3
20 NomPluslong prénom2 Role1
123 prénom2 Role1,Role2,Role3,Role4,Role5,Role6
\"@ > $FileTest
[/code:1]
Une fois les paramètres définis et la fonction de création d'objet associé crée, on appel la fonction
[code:1]
Import-FixedLength $FileTest $FieldNames $FieldWidths ${function:New-MonObjet}
[/code:1]
Je vous laisse créer la fonction qui s'affranchirait du paramétre $NewObject sur la fonction Import-FixedLength
Message édité par: Laurent Dardenne, à: 25/01/13 19:23<br><br>Message édité par: Laurent Dardenne, à: 26/01/13 12:39
[code:1]
function Import-FixedLength {
#Adapté de gallery.technet.microsoft.com/scriptcent...d3-8e4a-63f4e0d3735f
# $FieldWidths=@(5,15,-1) # Longeur des champs, -1 indique un champ de longueur variable
Param (
[string] $File,
[string[]] $FieldNames,
[int[]] $FieldWidths,
[ScriptBlock] $NewObject,
[switch] $PreserveWhiteSpace
)
Add-type -AssemblyName 'Microsoft.VisualBasic'
$Parser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($File)
$Parser.TextFieldType = 'FixedWidth'
#Par défaut on supprime les espaces en début et en fin de champ
$Parser.TrimWhiteSpace = -Not $PreserveWhiteSpace
$Parser.FieldWidths = $FieldWidths
while(!$Parser.EndOfData)
{
try
{
$CurrentRow = $Parser.ReadFields()
&$NewObject @CurrentRow
}
catch [Microsoft.VisualBasic.FileIO.MalformedLineException]
{ Write-Host \"Error, line $($_.Exception.LineNumber): $($Parser.ErrorLine)\" }
}
} #Import-FixedLength
[/code:1]
Pour le test on réutilise l'existant New-PSCustomObjectFunction et dans le code de la fonction on s'appuie sur le splatting .
[code:1]
#On nomme les champs, ces noms sont utilisés
#lors de la génération de la fonction créant des objets
# à partir des données importées.
$FieldNames=ql Numéro Nom Prénom Roles
#Pour l'import
$FieldWidths=@(5,13,18,-1)
#créer une fonction spécialisée
$FunctionFile='C:\Temp\New-MonObjet.ps1'
$Code=New-PSCustomObjectFunction 'MonObjet' $FieldNames -File
$Code|
Set-Content $FunctionFile
#Charge la fonction
.\"$FunctionFile\"
#Affiche son code, la présence du caractére '-' oblige cette syntaxe
${function:New-MonObjet}
Function ql {$args}
$function:ql
$FileTest=\"C:\temp\TestFixedLength.txt\"
@\"
1 Nom1 prénom avec espace Role1,Role2,Role3
20 NomPluslong prénom2 Role1
123 prénom2 Role1,Role2,Role3,Role4,Role5,Role6
\"@ > $FileTest
[/code:1]
Une fois les paramètres définis et la fonction de création d'objet associé crée, on appel la fonction
[code:1]
Import-FixedLength $FileTest $FieldNames $FieldWidths ${function:New-MonObjet}
[/code:1]
Je vous laisse créer la fonction qui s'affranchirait du paramétre $NewObject sur la fonction Import-FixedLength
Message édité par: Laurent Dardenne, à: 25/01/13 19:23<br><br>Message édité par: Laurent Dardenne, à: 26/01/13 12:39
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.098 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [Fonction] Import-FixedLength