IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Pb Import-CSV / Export-CSV [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut Pb Import-CSV / Export-CSV
    Bonjour à tous,

    Voilà, dans mon script j'ai plusieurs variables que j'essaie d'exporter dans un fichier .csv
    Voilà le bout de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mytab | select sam,sn,givenName,title,mail | Export-Csv -delimiter ";" -path C:\testfile.csv -NoTypeInformation

    Cela se fait bien mais ensuite que je veux l'importer dans powershell ça ne marche pas , en effet ça me donne cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $fil = import-csv "C:\testfile.csv"
     $fil
    
     sam;"sn";"givenName";"title";"mail"
    -------------------------------------
    rv;"test";"test1";"title1";"lala@msn.com"
    Alors que j'aimerais plus quelque chose comme ça :

    sam sn givenName title mail
    ---- ---- ----------- ------ --------
    rv test test1 title1 lala@msn.com


    Si vous avez une idée... merci bien

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par magzz69
    Si vous avez une idée...
    Tu peux utiliser, sous PS v2, le cmdlet ConvertTo-Csv qui envoi les objets dans le pipeline:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dir | Select Name,Length | ConvertTo-Csv -delimiter ";" -NoTypeInformation|Write-Warning
    Ainsi tu peux modifier la première ligne puis créer le fichier.
    Une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     #Utilise une fonction de la librairie de scripts Add-Lib
    cd $addlib.Scripts
    cd PackageLinq
    . .\PackageOperatorsLinq.ps1
    Function Set-HeaderCsv
    { #Ce type de fonction ne contient que le bloc End
      #La variable $Input est donc accessible et 
      #contient l'intégralité des objets issus du pipeline  
      "Name Length"
      "---- -----"
      $input 
    }
    Dir | Select Name,Length | ConvertTo-Csv -delimiter ";" -NoTypeInformation|Skip-Count 1|Set-HeaderCsv
    Je te laisse paramètrer la fonction Set-HeaderCsv

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Alors, j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir | Select Name,Length | ConvertTo-Csv -delimiter ";" -NoTypeInformation|Write-Warning
    Dir c'est bien le chemin de mon fichier que j'ai exporter avant .csv?
    Et select pour selectionner les champs du même fichier? donc pour moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chemin | Select sam,sn,givenName,title,mail | ConvertTo-Csv -delimiter ";" -NoTypeInformation|Write-Warning
    Cela ne marche pas

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magzz69
    Dir c'est bien le chemin de mon fichier que j'ai exporter avant .csv?
    Non, Dir est un alias de Get-ChildItem. J'ai pris un exemple que tout le monde peut tester. On renvoi le contenu du répertoire courant dans le pipeline.
    Citation Envoyé par magzz69
    Cela ne marche pas
    Tu veux dire que tu n'as aucun résultat ou que celui-ci ne correspondant à ton attente ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Je crois qu'en fait je n'ai pas compris car ça me met bien les nom et la longueur de mes fichier dans le répertoire courant en ligne de commande donc :

    AVERTISSEMENT : "Name";"Lenght"
    AVERTISSEMENT : "Chemintest.txt";"417"

    Mais ce que je n'arrive pas trop à voir c'est comment est ce que je peux mettre mes variable $sn,$sam,$givenName dans un fichier csv en les distinguant et non en faisant qu'une seule et même variable ou il y a : rv;"test";"test1";"title1";"lala@msn.com"

    Je souhaiterais que la premiere colonne = $sn la deuxieme $sam etc

    Comme ça quand je vais le réimporter je pourrais mettre 1colonne => 1variable

    Mais je n'ai toujours pas compris le principe

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magzz69
    Mais ce que je n'arrive pas trop à voir c'est comment est ce que je peux mettre mes variables $sn,$sam,$givenName dans un fichier csv en les distinguant et non en faisant qu'une seule et même variable ou il y a : rv;"test";"test1";"title1";lala@msn.com
    Il s'agit de noms de propriétés d'un objet et pas de noms de variable.
    Dans un fichier CSV il n'y a pas de variable, mais juste du texte, des lignes de texte structurées.
    Et effectivement je n'ai pas traité chaque ligne comme tu le souhaitais, mais juste la première.
    Citation Envoyé par magzz69
    Comme ça quand je vais le réimporter je pourrais mettre 1colonne => 1variable
    Si tu modifies la structure du fichier csv généré, le cmdlet import-csv ne fonctionnera plus .

    J'ai un peu de mal à comprendre ce que tu veux faire , je pensais que tu voulais générer un fichier texte ASCII.
    Quel est l'objectif ?
    D'ou proviennent tes données ?
    Quels usage comptes-tu en faire ?
    Que veux-tu rendre persistant en utilisant un fichier ?
    etc.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Oui je crois que je me suis mal exprimée

    j'ai crée un petit fichier powershell avec des windows form etc etc je récupère un utilisateur de mon AD j'affiche les informations dans des textbox .
    Je voudrais faire un mini fichier de log pour que dès qu'une personne appuie sur le bouton enregistrer les informations présentes dans les textbox soit envoyées dans un fichier csv (pour que l'on puisse surveiller les valeurs modifiées).

    J'ai donc réussi a y exporter dans un fichier csv avec pour chaque colonne une information de mon utilisateur AD (ex : son nom, prénom etc). Sauf que lorsque j'essaie d'y importer pour tester cela ne marche pas .

    J'ai fait quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $import1 = Import-Csv -path C:\testimport.csv -OutVariable string
       
    foreach ($Line in $import1)
    {
        $this_mail               = $Line.mail
        $this_sam                = $Line.sam 
        $this_givenName       	 = $Line.givenName 
        $this_title              = $Line.title 
    }
    textbox1.Text = $this_mail

    Sauf que ça ne fait rien, je n'ai rien dans ma textbox


    J'ai vu que normalement dans l'import quand on testait en ligne de commande il devait y avoir un colonne pour chaque propriété

    Moi mes propriétés sont sn, sam, givenName etc mais ça ne marche pas puisque ça ne me met qu'une colonne intitulée :
    sam;"sn";"givenName";"title";"mail"

    Voilà mon soucis, je ne sais pas si je me fait bien comprendre...

    Merci en tout cas pour l'aide

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magzz69
    J'ai fait quelque chose comme ça :
    Cela fonctionne sur mon poste, mais ainsi tu n'as que le dernier objet d'affiché, étant donné que l'affectation du textbox se fait en dehors de la boucle.
    Citation Envoyé par magzz69
    Sauf que ça ne fait rien, je n'ai rien dans ma textbox
    Certe, mais n'ayant pas le script de la winform sous les yeux, difficile de t'aider sur ce point.
    Citation Envoyé par magzz69
    Moi mes propriétés sont sn, sam, givenName etc mais ça ne marche pas puisque ça ne me met qu'une colonne intitulée :
    sam;"sn";"givenName";"title";"mail"
    Désolé je ne comprends pas. Il faut nous présenter un code qui met en évidence ce pb.
    Que donne l'affichage de l'exécution du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $import1 = Import-Csv -path C:\testimport.csv 
    $import1[0]|Get-Member
    Est-ce que le chargement du fichier csv généré est correctement affiché dans Excel, par exemple ?
    L'import crée un tableau d'objets qui possédent les propriétés que tu as précédement exportés. Sur ce point je pense qu'on est d'accord.
    J'ai un peu de mal à comprendre pourquoi tu références une notion de colonne alors que tu récupères des objets
    Citation Envoyé par magzz69
    Voilà mon soucis, je ne sais pas si je me fait bien comprendre...
    C'est déjà plus clair, mais bien qu'utilisant les même mots, je ne suis pas certains que nous leur donnions la même signification.

    De ce que j'ai compris, je ne pense pas qu'il soit nécessaire de modifier la structure du csv.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    J'ai testé la commande elle ne marche pas (message d'erreur en Pièce jointe).

    Pour le code des winform je veux bien le donner mais il y a plus de 1000 lignes dans mon code

    Je ne sais pas si le problème ne viendrait pas de l'export car je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mytab | select sam,sn,givenName,title,mail,telephoneNumber,facsimileTelephoneNumber,mobile,ipPhone,Department,company,StreetAddress,PostalCode,l,co | Export-Csv -delimiter ";" -path C:\testfile.csv -NoTypeInformation
    ça me donne dans le .csv en notepad:

    "sam";"sn";"givenName";"mail"
    "rv";"RV";"Name";"miiii@msn.com"

    ça a l'air pas mal pourtant
    Images attachées Images attachées  

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Pour l'erreur tu ne récupéres qu'un seul objet et pas un tableau d'objet, l'indexation ne fonctionne donc pas.
    Es-tu sûr de ne pas écraser ton fichier à chaque fois, tu fais bien un append dans ton csv ?
    Si j'ai bien compris que c'était un fichier d'historique
    Citation Envoyé par magzz69
    Pour le code des winform je veux bien le donner mais il y a plus de 1000 lignes dans mon code
    Il y a beaucoup de traitements ou beaucoup d'objets ?
    Pour le moment le pb est autour du csv.
    Citation Envoyé par magzz69
    Je ne sais pas si le problème ne viendrait pas de l'export car je fais :
    A part ceci :
    la syntaxe me semble correcte.
    Citation Envoyé par magzz69
    ça me donne dans le .csv en notepad:
    Entre la liste des noms de propriétés précisés dans le select et ceux générés dans le csv il y a un pb :/
    Sinon la structure du csv est correcte, 1 objet-> 2 lignes.
    Que contient $MyTab, un tableau ou un objet et de quel type ?
    Essaie de faire un Select uniquement, pour vérifier si toutes les propriétés sont bien renseignés.
    Si je crée un objet et l'exporte, j'ai bien le nb de champs dans le csv:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $o=1| select sam,sn,givenName,title,mail,telephoneNumber,facsimileTelephoneNumber,mobile,ipPhone,Department,company,StreetAddress,PostalCode,l,co
    $o
    #ok
    $o|Export-Csv -path "$pwd\test.csv"
    type "$pwd\test.csv"
    #TYPE Selected.System.Int32
    "sam","sn","givenName","title","mail","telephoneNumber","facsimileTelephoneNumber","mobile","ipPhone","Department","company","StreetAddress","PostalCode","l","co"
    ,,,,,,,,,,,,,,

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Alors moi aussi ça me fait bien ça dans le .csv quand je l'exporte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #TYPE Selected.System.Int32
    "sam","sn","givenName","title","mail","telephoneNumber","facsimileTelephoneNumber","mobile","ipPhone","Department","company","StreetAddress","PostalCode","l","co"
    ,,,,,,,,,,,,,,

    l et Co sont normales se sont la ville et la country

    Pour J'ai un : System.Management.Automation.PSCustomObject


    De plus, j'écrase à chaque fois le fichier, je ne sais pas comment rajouter une ligne à chaque fois

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magzz69
    De plus, j'écrase à chaque fois le fichier, je ne sais pas comment rajouter une ligne à chaque fois
    QQ chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     $FileName="$pwd\test.csv"
      #Récupère les anciennes infos dans un tableau
     $OldRecord=import-Csv -path $FileName
      #Ajoute les nouvelles infos au tableau
     $NewRecord=$OldRecord+$MyTab
      #enregistre les nouvelles infos dans le fichier
     $NewRecord|Export-Csv -path $FileName

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Alors il veut pas du + entre oldRecord et le mytab (erreur en pj )


    --- EDIT---
    En fait c'est bon j'ai mis une virgule au lieu du plus
    mais dans mon .csv je n'ai plus les bonnes lignes j'ai ça :


    #TYPE System.Object[]
    Count,"Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
    2,"2","2","1","System.Object[]","False","True","False"
    ,,,,,,,
    Images attachées Images attachées  

  14. #14
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magzz69
    mais dans mon .csv je n'ai plus les bonnes lignes j'ai ça :
    Cela indique que $NewRecord est un tableau de tableau et pas un tableau à une dimension.
    Place en pj ton script et ton fichier csv "correct", sinon je pense qu'on va avoir du mal à avancer

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Voila le fichier csv exportant correctement les données et mon script (l'important est entre les lignes 518 & 600 a peut pres) Le reste c'est super mal codé je suis pas développeur ^^


    Pour les fichiers je les ais mis en txt mais c'est : testfile.csv & ExtractADProject.ps1
    Fichiers attachés Fichiers attachés

  16. #16
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Il y a + pb :
    -la structure de ton fichier csv joint est erronée,
    -les appels à Import-Csv doivent utiliser le même delimiteur sinon le cmdlet ne s'y retrouve pas,
    -et l'import doit prendre en considération le cas où le fichier contient une seule ligne, dans ce cas on renvoi un scalaire et pas un tableau (celle là m'appartient )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $OldRecord=@(import-Csv -path $FileName -delimiter ";")
    Avec le groupe @() on s'assure de tjr renvoyer un tableau.

    Ensuite l'affichage du nom se fait, mais c'est le dernier nom.
    Là je te laisse faire, car je n'ai pas compris ce que tu veux faire...
    Citation Envoyé par magzz69
    Le reste c'est super mal codé
    Je ne pense pas, pas structuré certainement.
    Pas de constante pour le nom de fichier, pas de fonction pour les traitements récurrents, pas de commentaires, bref une maintenance délicate s'annonce

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Lorsque j'importe le fichier csv l'affichage tu nom ne se fait pas :s
    c'est comme si la valeur $this_sam était null

    EDIT

    Okkk je viens de comprendre!!! Comme tu me l'as dit c'est bien le manque du delimiter dans le import qui faisait tout planter!!!

    ça marche super maintenant, encore 2-3 petits détails à régler mais c'est bon

    Merci beaucoup!!!!

  18. #18
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    As-tu recréer le fichier csv?
    As-tu corrigé chaque occurence d'import-csv ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $Button_import_OnClick= 
    {
      $import1 = Import-Csv -path "C:\testfile.csv" -delimiter ";"
      foreach ($Line in $import1)

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Je continue avec une autre questions

    Je voudrais quand j'importe mon .csv ne choisir qu'une seule ligne (par rapport à la première colonne)

    Mon fichier csv est de ce type :
    sam;sn;givenName...
    login;nom;prenom...
    login1;nom1;prenom1...
    login2;nom2;prenom2...

    Je voudrais que si dans la première colonne j'ai "login1" alors je mette les informations dans les textbox; j'ai fait ça mais ça ne marche pas il me met juste la bonne valeur login1 dans la première textbox mais dans les autres il me met la valeur de ma dernière ligne c'est à dire : nom2 prenom2 => voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $import1 = Import-Csv -delimiter ";" -path C:\testfile2.csv -OutVariable string
    
       
    foreach ($Line in $import1)
    {
    
    if ($Line.sam = "login1"){
                    $Textbox1.Text = $Line.sam
    		$Textbox2.Text = $Line.sn
    		$Textbox3.Text = $Line.givenName
    				}
    
    }

  20. #20
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magzz69
    j'ai fait ça mais ça ne marche pas
    Certes, là ce n'est pas un pb technique mais du debug de script.

    Dans ce cas utilise :
    -Write-Debug, couplé avec DebugPreference="Continue",
    - $host.EnterNestedPrompt() pour ouvrir une "session imbriquée" et vérifier les variables,
    - ou encore Write-properties pour afficher dans un debugger externe.

    Il reste aussi ISE, l'interface graphique autorisant des fonctions avancées de debug pas à pas, etc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CSV] export csv pour lecture sur mac
    Par lodan dans le forum Langage
    Réponses: 2
    Dernier message: 24/09/2008, 16h42
  2. [CSV] Export CSV valeurs décimales
    Par Nemesis007 dans le forum Langage
    Réponses: 2
    Dernier message: 15/05/2008, 09h39
  3. [CSV] Export CSV valeurs/chaine de caractères
    Par Nemesis007 dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2008, 13h53
  4. [CSV] export CSV sous IE
    Par Rawone dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2006, 10h10
  5. [CSV] Export CSV avec PHP (saut de ligne)
    Par Indy80 dans le forum Langage
    Réponses: 2
    Dernier message: 10/08/2006, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo