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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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