Question Conversion export métadonnées en csv

Plus d'informations
il y a 7 mois 3 semaines - il y a 7 mois 3 semaines #33390 par hxcode
Bonjour,

Pour l'un de mes chantiers de migration d'une GED, je possède un fichier TXT contenant la liste des documents (plusieurs milliers) et leurs métadonnées. 
Pour un document, cela représente dans le fichier TXT un bloc de 210 lignes. La première métadonnée étant "docontrol" et la dernière "updated".
Je souhaiterai convertir le fichier TXT en CSV.
Il est possible de splitter chaque ligne en deux avec ':' --> <nom de colonne> : <valeur>

Exemple de bloc:
docontrol:  1
typedocumentabbr:  AP
OfficeModelKey:  
GDocVersion:  
...
...
WkfP_Name:  Arrété
WkfP_IDProcess:  ArrétéV8
updated : 20230925

Comment faire pour récupérer l'ensemble des noms de colonnes pour créer un .CSV puis parser le fichier TXT pour alimenter les datas sans devoir créer un PSCustomObject et devoir saisir les 210 colonnes dans le script.

Merci de votre aide.


 
Dernière édition: il y a 7 mois 3 semaines par hxcode.

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

Plus d'informations
il y a 7 mois 3 semaines #33392 par Laurent Dardenne
Salut,
peut être ceci :
powershell-scripting.com/index.php/forum...structuredfile#18355

Sinon reprendre le principe de cette fonction:
#Remove-AuthenticodeSignature.ps1
Filter Remove-AuthenticodeSignature{
#([Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding] $Encoding="ASCII")

 
   function Parse([String] $FileName)
   { #renvoi toutes les lignes sauf celles du bloc de signature
     $isSignatureBloc=$False
     Get-Content -Path $FileName|
     Foreach-Object { 
       switch ($_)  
       {
         "# SIG # Begin signature block"  {$isSignatureBloc=$True;continue}
         "# SIG # End signature block"    {$isSignatureBloc=$False;Continue}
          
         default {
           if ($isSignatureBloc -eq $false)
              #On traite les lignes qui ne se trouvent dans le bloc de signature 
            {$_}
         }#default
      }#Switch
     }#Foreach
   }#Parse
   
 if ($_ )
 {  
   #Récupére un nom de fichier créé par l'OS
  $TempFile = [IO.Path]::GetTempFileName()
  $FullPath=Resolve-Path "$_"
  Write-Debug "$TempFile"
  Write-Debug "$FullPath" 
  
  
   #Extrait toutes les lignes sauf la signature dans un fichier temporaire 
  Parse "$FullPath"|Set-Content "$TempFile"

   #Ecrase le fichier d'origine à partir du fichier temporaire
   #$FileInfo.Replace ne fonctionne pas car %Temp% 
   #peut être sur un disque différent de celui de la source :/ 
  Get-Content "$TempFile"|Set-Content "$FullPath" 
  Del "$TempFile" 
 }
 else {Write-Error "[Remove-AuthenticodeSignature] Ce filtre a reçu une donnée `$null du pipeline."}
}

Tutoriels PowerShell

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

Plus d'informations
il y a 7 mois 3 semaines - il y a 7 mois 3 semaines #33393 par Laurent Dardenne
Je voulais m'assurer que la solution proposée réponde à ton besoin, du coup un exemple de paramétrage de la fonction Convert-BlockStructuredFile :
$sbSplit = {
#Ne déclare pas de paramètre mais référence l'objet du pipeline
# Une regex peut construire un membre de type NoteProperty ou d'un autre type
#La fonction Convert-BlockStructuredFile construit en interne l'objet et
#lui ajoute chaque nouveau membre créé par ce scriptblock

switch -regex ($_) {

#Nom +( espaces optionnels)+ séparateur + valeur
'^(?<Name>.*?)\s*:(?<Value>.*)$' {
Write-Debug ("`tAjoute la propriété {0}" -F $Matches.0)
New-Object Management.Automation.PSNoteProperty($Matches.Name, $Matches.Value)
Continue
}

'' { Write-Debug "`tLigne vide"; Continue }
default { Write-Error 'Cas inconnu : $Element' }
}
} #$sbSplit

$file = 'c:\temp\docontrol.txt'

$properties = @(
'docontrol',
'typedocumentabbr',
'OfficeModelKey',
'GDocVersion',
'WkfP_Name',
'WkfP_IDProcess',
'updated'
)
$Objets = Get-Content $File -Encoding UTF8 | Convert-BlockStructuredFile -LinePerBloc 7 -Property $properties -Split $sbSplit


La regex de reconnaissance est sensible à la structure des données en entrées :

WkfP_IDProcess: ArrétéV8
updated : 20230925
 

ici la ligne 'updated' contient un espace avant le caractère deux point ':'

Le résultat en psObject

$objets

docontrol : 1
typedocumentabbr : AP
OfficeModelKey :
GDocVersion :
WkfP_Name : Arrété
WkfP_IDProcess : ArrétéV8
updated : 20230925

docontrol : 3
typedocumentabbr : AP
OfficeModelKey :
GDocVersion :
WkfP_Name : Arrété
WkfP_IDProcess : ArrétéV6
updated : 20230725

docontrol : 2
typedocumentabbr : AP
OfficeModelKey :
GDocVersion :
WkfP_Name : Arrété
WkfP_IDProcess : ArrétéV10
updated : 20230925
 


Tutoriels PowerShell
Dernière édition: il y a 7 mois 3 semaines par Laurent Dardenne. Raison: coquille

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

Plus d'informations
il y a 7 mois 3 semaines #33395 par Laurent Dardenne
un oubli :
Comment faire pour récupérer l'ensemble des noms de colonnes pour créer un .CSV puis parser le fichier TXT pour alimenter les datas sans devoir créer un PSCustomObject et devoir saisir les 210 colonnes dans le script.

La solution proposée parse le fichier TXT et crée une liste de PSCustomObject.
Le paramètre de l'appel doit connaitre le nombre de ligne constituant un objet (ici 210) et les noms de tous les champs/propriété.
Une fois la liste construite tu en fais ce que tu veux :-)

Tutoriels PowerShell

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

Temps de génération de la page : 0.118 secondes
Propulsé par Kunena