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 :

Copier certaines lignes de fichiers texte qui sont dans un répertoire donné


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Par défaut Copier certaines lignes de fichiers texte qui sont dans un répertoire donné
    Bonjour,

    Je cherche à convertir les données d'un certains nombre de fichiers texte en un seul .csv. Dans un répertoire donné j'ai plusieurs fichiers texte ils contiennent tous le même nombre de lignes, ce qui change c'est les valeurs de certaines lignes. J'aurais voulu pour chaque fichier texte présent, copier certaines lignes pour ensuite construire un csv. Chaque ligne sera une colonne du fichier .csv.

    ça serait quelque chose comme l'exemple 1 de la doc de Microsoft : https://learn.microsoft.com/fr-fr/po...powershell-7.4 sauf que je ne comprends pas ils utilisent deux fois le fichiers LineNumbers.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1..100 | ForEach-Object { Add-Content -Path C:\Users\utilisateur\dossier -Value "This is line $_." }
    Get-Content -Path .\LineNumbers.txt
    je suppose que le -Path après le Add-Content c'est le répertoire dans lequel je veux les fichiers, j'ai besoin de seulement les lignes 5,9,13,14,64,65 et 81

    Savez-vous comment faire ?

    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Par défaut
    Bonjour,

    Avec ça j'arrive à avoir le contenu des lignes que j'ai besoin sur un fichier texte, maintenant il faudrait que le retour de chaque Get-Content soit envoyé dans un fichier csv sur une même ligne séparé par des virgules et une boucle qui passent ces commandes sur chaque fichier texte du répertoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Get-Content "monfichiertext.txt" | Select-Object -Skip 4 -First 1
    Get-Content "monfichiertext.txt" | Select-Object -Skip 8 -First 1
    Get-Content "monfichiertext.txt" | Select-Object -Skip 12 -First 1
    Get-Content "monfichiertext.txt" | Select-Object -Skip 13 -First 1
    Get-Content "monfichiertext.txt" | Select-Object -Skip 63 -First 1
    Get-Content "monfichiertext.txt" | Select-Object -Skip 64 -First 1
    Get-Content "monfichiertext.txt" | Select-Object -Skip 80 -First 1
    Merci d'avance

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Get-ChildItem -Path "C:\Users\utilisateur\dossier\*.txt" | ForEach-Object {
        $content = $_ | Get-Content
        (5, 9, 13, 14, 64, 65, 81 | ForEach-Object {$content[$_]}) -join "," | Add-Content -LiteralPath "C:\Users\utilisateur\dossier\output.txt"
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Par défaut
    merci pour ce code, j'ai fait quelque essais avec mais je me rends compte que sur les fichiers texte source il y a sur certains des lignes en plus. Donc sur le fichier en sortie en fonction des lignes j'ai pas le même contenu. j'ai juste modifié le script en rajoutant des lignes :

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Get-ChildItem -Path "C:\Users\utilisateur\dossier\*.txt" -Recurse | ForEach-Object {
        $content = $_ | Get-Content
        (5, 7, 9, 12, 13, 14, 15, 16, 17, 39, 41, 42, 44, 51, 53, 64, 65, 81, 75 | ForEach-Object {$content[$_]}) -join "," | Add-Content -LiteralPath "C:\Users\utilisateur\dossier\output.csv"
    }

    Je voudrais rajouter par exemple sur la ligne 7 si le contenu est égal à code ça ne l'ajoute pas au fichier de sortie et donc ça met en sortie la ligne 9. Est-ce que c'est possible de faire cela ?

    J'ai trouvé quelque chose qui fonctionne avec la version 7.x de powershell, au préalable je convertit tous les fichiers texte en UTF8. J'ai pas trouvé la façon de faire qui fonctionne pour remplacer tous les caractères accentués par leur version non accentué dans le fichier. Au niveau de la ligne 15 du script il me crée une autre version du fichier texte car sinon il me sort une erreur comme quoi il ne peut pas écrire dans le fichier original mais maintenant il faut faire le tri et enlever le fichier original

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Get-ChildItem -Path "C:\Users\utilisateur\dossier\*.txt" -Recurse | ForEach-Object {
      # On remplace la ligne 6 pour enlever l'accent
      $content = Get-Content $_.FullName
      $content[6] = $content[6] -replace "Titre - Dénomination SIREN","Titre - Denomination SIREN Code NACE"    
      Set-Content -Path $_.FullName -Value $content  
     
      # il faut supprimer maintenant les lignes 7 et 8 uniquement si la ligne 6 vaut Titre - Denomination SIREN Code NACE
      $string = Get-Content $_.FullName
      $fullname = $_.FullName
      $adding = "-mod.txt"
      $fullnameNew = $fullname + $adding
      if ($string[6] -eq "Titre - Denomination SIREN Code NACE") {
        Get-Content -Path $_.FullName  | Select-Object -SkipIndex (7..8) |
           Set-Content $fullnameNew
      }
    }

  5. #5
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2024
    Messages : 10
    Par défaut
    Bonjour,

    Est-ce que les lignes t’intéressent réellement selon leur numéro de ligne, ou selon leur format ? ou le fichier est-il un minimum formaté ?

    Car si ce n'est pas strictement le numéro ligne, des regex devraient pouvoir venir à ton secours... j'imagine.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Par défaut
    Bonjour,

    Je dois récupérer les données par ligne, par exemple sur 3 lignes j'ai le nom de l'entreprise, son numéro et sa rue, son code postal et sa ville et dans certains fichiers le nom de l'entreprise peut-être sur deux lignes. Il y aurait uniquement le numéro SIRET qui pourrait être récupérable en regex.

    Mais j'ai un décalage en fonction des fichiers aussi car le libellé d'activité peut occuper 4 à 2 lignes en fonction des fichiers ou parfois il se retrouve à la suite de l'adresse.

    Dans un premier temps mon script il harmonise les fichiers pour retrouver partout à une numéro de ligne donné la même information.

  7. #7
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2024
    Messages : 10
    Par défaut
    Et tu n'as aucun "entête" dans le fichier, qui lui serait normé, malgré des données au format divers ?

    Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    entreprise :
    nom
    de l'en
    treprise
    adresse:
    Ceci
    est
    une adresse
    et ainsi de suite ?
    Ou ne serait-ce qu'une virgule, même perdue au milieu des lignes, qui séparerait les données ?

    sans ça, tu seras dans l'obligation de valider visuellement ton résultat, à chaque fois.

  8. #8
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2024
    Messages : 10
    Par défaut
    A priori c'est la cas, tu as des choses, en tous les cas pour le Siren par exemple. non ?

    C'est important car si tu as des "entêtes", tu peux faire des regex, non pas sur les valeurs, mais en tenant compte des entêtes, car ce qu'il y a entre deux entêtes... c'est une donnée !

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 213
    Par défaut
    Un exemple anonymisé j'ai pas tout mis le contenu du fichier, il y a juste un séparateur qui est un espace. Dans l’exemple la personne à un 3éme prénom, ça fait que son adresse tient sur 4 lignes dans d'autres cas elle tient sur trois lignes. Dans l'exemple le libellé d'activité est sur trois lignes "Vente par automates et autr" mais dans d'autres cas il peut-être sur deux ou 4 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    22/03/2024 14:13 Fiche
    file:///C:/Users/utilisateur/AppData/Local/Temp/Fiche.html 1/2
    ANNEE : 2023 
    Titre - Dénomination SIREN
    Code
    NACE
    NOM PRENOM DEUXIEMEPRENOM 444444444 4799B
    N° imm. bis/ter Code voie Libellé voie
    Libellé
    activité
    principale
    2700 0160 IMP DE L'EXEMPLE d'EN HAUT
    Vente par
    automates
    et autr
    Désignation du propriétaire et adresse du lieu d'activité
    NOM PRENOM DEUXIEMEPRENOM
    TROISIEMEPRENOM
    2700 IMP DE L'EXEMPLE d'EN HAUT
    00000 LAVILLE
    Réduction
    des locaux industriels
    0
    Réduction création
    d'établissements
    Réduction artisans et
    autres
    Chiffre d'affaires retenu
    <= 10 000 WXYZ

  10. #10
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2024
    Messages : 10
    Par défaut
    Re,

    Je pense donc que les Regex peuvent t'aider.

    Sauf erreur de ma part, les données entre "SIREN" (qui se trouve à la fin de la ligne 4) et "N° imm" (au début de la ligne 8) sont des données, en l'occurrence le titre, la dénomination, et le SIREN.

    Du coup, je fait cela :
    je récupère le fichier sur une seule ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $OneLine = (Get-Content -Path '.\nouveau 2.txt' ) -join " "
    J'ai donc une belle string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    22/03/2024 14:13 Fiche file:///C:/Users/utilisateur/AppData/Local/Temp/Fiche.html 1/2 ANNEE : 2023  Titre - Dénomination SIREN Code NACE NOM PRENOM DEUXIEMEPRENOM 444444444 4799B N° imm. bis/ter Code voie Libellé voie Libellé activité principale 2700 0160 IMP DE L'EXEMPLE d'EN HAUT Vente par automates et autr Désignation du propriétaire et adresse du lieu d'activité NOM PRENOM DEUXIEMEPRENOM TROISIEMEPRENOM 2700 IMP DE L'EXEMPLE d'EN HAUT 00000 LAVILLE Réduction des locaux industriels 0 Réduction création d'établissements Réduction artisans et autres Chiffre d'affaires retenu <= 10 000 WXYZ
    Et la, je découpe et décortique à coup de regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $TitreDenSir = $OneLine -replace '^.*SIREN(.+)N°.*$','$1'
    Voila ce qu'il y a dans ma variable $TitreDenSir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Code NACE NOM PRENOM DEUXIEMEPRENOM 444444444 4799B
    Comme j'imagine que le format du code nace est prévisible, tout comme celui du SIREN, tu peux donc, toujours avec des -replace et des RegEx, redécouper les données... et ainsi de suite pour toute les données ou presque.

    C'est loin d'être une solution clef en main, mais personnellement, je tenterais une approche dans le genre.

  11. #11
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fiche file:///C:/Users/utilisateur/AppData/Local/Temp/Fiche.html
    Si il y a un html exploitable ça sera peut être plus facile

Discussions similaires

  1. [Débutant] Localiser les lignes d'un fichier .CSV qui sont identiques
    Par fahimonasri dans le forum MATLAB
    Réponses: 0
    Dernier message: 04/12/2015, 21h50
  2. [WD12] gestions de fichiers texte qui ne sont pas au format "txt"
    Par le pingouin fou dans le forum WinDev
    Réponses: 4
    Dernier message: 21/06/2011, 11h52
  3. [MySQL] Ecouter les fichier mid qui sont dans la base mysql
    Par rane dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/02/2008, 17h12
  4. [vb6]:Recuperer les caracteres qui sont dans un fichier text
    Par flav66 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 23/10/2006, 08h44
  5. Réponses: 1
    Dernier message: 29/08/2006, 14h45

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