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 :

Multi Insert colonne dans un fichier texte ?


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Multi Insert colonne dans un fichier texte ?
    Bonjour a tous,

    Je n'ai peut être pas le terme ou les mots adéquates, je montre donc avec des copies d’écrans
    avec Notepad++ il est possible de faire une sélection d'une colonne n'importe ou du moment ou il y a du texte avec la combinaison Alt+Mouvement de la souris pour faire la sélection d'une colonne et il est aussi d’écrire en pré-sélectionnant

    Exemple plus parlant avec les copies d'écrans
    1) Mon fichier de base :


    2) Mon fichier avec la sélection (le trait avec les lettres C de coucou) (avec la combinaison de touche ATL+ SelectSouris)


    3) Mon fichier avec l'insertion multiple



    Est-il possible de faire cette même chose avec powershell ?
    Je pense qu'il faut définir un pointeur mais sur toute une colonne du fichier je ne vois pas trop comment faire

    l'avantage est d’évité l'insertion en lisant chaque ligne ...


    Exemple mon tableau ressemblerait a un format suivant :


    Je ne peux pas utiliser les espaces (\s+) comme séparateurs car dans les valeurs j'ai des espaces et ça met la grouille dans la séparation
    Dans une routine je prends la ligne ayant les tirets qui me sers de référence pour faire les séparations des colonnes ou je recupere le Length, ça me donne chaque position de séparateur pour les lignes suivantes
    J'ai donc écrit un autre bloc pour faire le découpage mais cela prend plus de 3 heures et des fois 6h en fonction des données a traitées, cela pourrais aller beaucoup plus vite si j'arrive a faire un traitement au lieux de plusieurs de chaque ligne

    En vous remerciant d'avance

  2. #2
    Membre habitué
    ça doit être une piste, je viens de trouvé ceci

    (gc "TonFichier") -replace ".{7}" , "$&;" | sc out.txt

    Tous les 7 caractères il va mettre un point virgule et sur chaque ligne
    J'ai testé sans le $& ça ne fonctionne pas terrible et donc ça a son importance

    Le problème avec cette commande c'est qu'il positionne un point virgule tous les 7 caractères et j'ai des positions différente a mettre, exemple : 7, 19, et 55
    J'ai donc tester ".{7, 19, 55} ... mais ça ne fonctionne pas des idées ?

  3. #3
    Expert confirmé
    C'est quoi l’objectif ?

  4. #4
    Membre habitué
    d'aller plus vite et d’évité les boucles interminable.

  5. #5
    Expert confirmé
    L'objectif est d'ajouter une guillemet aux 7eme caractères ?

  6. #6
    Membre habitué
    Non c'est le 10 caractère de chaque ligne --> $test1 = "
    C'est possible faire une insertion facilement en faisant une boucle sur chaque ligne et d'y faire l'insertion mais ça prendre beaucoup trop de temps de faire un balayage de chaque lignes, j'ai plusieurs insert a faire sur la même ligne exemple ça pourrait être la position 10 puis 14 et la 21
    Ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (gc "TonFichier") -replace ".{7}" , "$&;"
    fait l'insertion d'une virgule tous les 7 caractères ou il trouve une ligne (sans faire de boucle de chaque lignes, gros gain de temps)
    J'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (gc "TonFichier") -replace ".{10,14,21}" , "$&;"
    en espérant que ça aurait pu faire les insertions au emplacement 10,14 et 21 mais non dans mes rêves ...

  7. #7
    Expert confirmé
    En vérité c'est une simplification d'écriture de code, il parcourt chaque ligne pour faire le remplacement.

    Le -replace tel que tu l'utilise est de type expression régulière. Ce que tu souhaite faire est réalisable en cherchant un peu.

  8. #8
    Membre habitué
    En répondant de ce genre de remarque : En cherchant un peu ?
    La réponse est certaines : Sympa l'esprit d'aide ! (la perception que j'en ai)
    Si javais trouvé quelque chose je serais pas venu demander de l'aide dans le forum ... Oui oui j'ai recherché avec l'ami de tous "Google" !


    Comme j'ai déjà dit, j'ai déjà fait un bout de code qui fonctionne plutôt bien mais pas du tout optimisée, en fonction de la taille du fichier (des fichiers) cela prend de 3h a 6h (2Go à 4Go), et effectivement j'utilise un foreach pour lire chaque ligne et faire l'insert mais cela prend beaucoup de temps !
    Si une fonction existe en powershell tel-que notepad++ qui fait une sorte de sélection verticale pour faire l'insert serait top !
    Merci d'avance

  9. #9
    Expert confirmé
    Je pensais qu'en aiguillant ta recherche sur les expressions régulières tu pourrais t'en sortir.

    Je n'ai pas la science infuse (d'ailleurs je ne connais pas le $&) et l'expression régulière ne m'est pas apparu en clair, désolé que cet réponse ne te suffise pas et que la solution clé en main ne te soit pas encore fournie.

    Nous n'avons pas non plus ton code avec la boucle "foreach" qui semble fonctionner mais lent, ce qui ne nous permet non plus de tenter de l'optimiser.

  10. #10
    Expert confirmé
    Voici en complément un début d'optimisation pour la lecture de gros fichier
    http://www.happysysadm.com/2014/10/r...owershell.html

  11. #11
    Membre habitué
    Bonjour,

    Le fait de demander de l'aide dans un forum pour avoir une solution clef en main est peut être le top mais c'est pas ce que je demande.
    Comme vous avez pu le dire :
    En vérité c'est une simplification d'écriture de code, il parcourt chaque ligne pour faire le remplacement.
    Il me semble pas nécessaire de poster le code en soit vu que c'est assez simple (mais très lent).

    De souvenir en VB.Net ou C# il était possible de définir un offset sur un fichier et de récupérer la valeur ou écrire a un emplacement sans forcement lire tout le fichier, cela est peut-être possible avec a faire avec Powershell ?

    L'article que vous avez donné est très intéressant et super bien expliqué, merci beaucoup

###raw>template_hook.ano_emploi###