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

Groovy Java Discussion :

pb de boucle et sortie fichier


Sujet :

Groovy Java

  1. #1
    Futur Membre du Club
    Femme Profil pro
    analyste fonctionelle
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : analyste fonctionelle
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Points : 9
    Points
    9
    Par défaut pb de boucle et sortie fichier
    Bonjour,

    Je dois créer un script en groovy qui doit permettre de faire un remplacement de caractère dans un fichier.
    Je suis malheureusement bloquée et je ne vois pas où je me trompe.

    Le contexte est :
    je reçois plusieurs fichiers (lÃ* j'ai mis un exemple de fichier dans le code ci-dessous), je dois vérifier que dans le fichier si le tag :25: (chaque tag commence par : suivi de 2 chiffres puis : Ã* nouveau, exemple :25 commence par AB, alors je dois vérifier dans les tags :61: si elle contient la valeur "///".
    Si c'est le cas, je dois remplacer cette valeur par "//". Chaque nouvelle séquence dans un fichier commence par ":20:" et se termine par un tag ":64:".

    Exemple de fichier reçu:
    {1:F01 0000000000}{2:O9400000240919 00000000002409190745N}{4:
    :20:0027182203245
    :25:AB1234
    :28C:262/1
    :60F:C240918USD1,00
    :62F:C240918USD1,00
    :64:C240918USD1,00
    -}
    {1:F01 0000000000}{2:O9400000240919 00000000002409190745N}{4:
    :20:0027182200001
    :25:AB3456
    :28C:262/1
    :60F240918USD1,00
    :61:2409160918DN1,00/ROC///TEST
    /TEST
    :86:/TEST
    /TEST
    :61:2409130918DN1070NTRFTEST//
    /TEST
    :86:/TEST
    TEST
    :61:2409170918DN91,22NTRFTEST/TEST//
    /TEST
    :86:/PT/FT/PY/TEST
    :62F240918USD1,00
    :64240918USD1,00
    -}

    Attendu (suppression des /// qui seront remplacés par // :

    {1:F01 0000000000}{2:O9400000240919 00000000002409190745N}{4:
    :20:0027182203245
    :25:AB1234
    :28C:262/1
    :60F:C240918USD1,00
    :62F:C240918USD1,00
    :64:C240918USD1,00
    -}
    {1:F01 0000000000}{2:O9400000240919 00000000002409190745N}{4:
    :20:0027182200001
    :25:AB3456
    :28C:262/1
    :60F240918USD1,00
    :61:2409160918DN1,00/ROC//TEST
    /TEST
    :86:/TEST
    /TEST
    :61:2409130918DN1070NTRFTEST//
    /TEST
    :86:/TEST
    TEST
    :61:2409170918DN91,22NTRFTEST/TEST//
    /TEST
    :86:/PT/FT/PY/TEST
    :62F240918USD1,00
    :64240918USD1,00
    -}

    Voici le code que j'ai fait mais qui ne fonctionne pas :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    	// Fonction pour traiter le fichier
    	def input = '''voir exemple au-dessus'''
        def outputLines = []
        def current25Tag = ''
     
        def insideBlock = false
        input.eachLine { line ->
            if (line.startsWith(':25:')) {
                // Si nous entrons dans un nouveau bloc :25:, nous devons stocker l'ancien
                if (insideBlock) {
                    outputLines << current25Tag // Écrit le dernier :25: si un bloc était ouvert
                    insideBlock = false
                }
                current25Tag = line // Stocke le tag :25:
                insideBlock = true // Indique que nous sommes dans un bloc :25:
            } else if (line.startsWith(':61:') && insideBlock) {
                // Vérifie si le tag :25: commence par "RO"
                if (current25Tag.startsWith(':25: RO')) {
                    // Remplace "///" par "//" dans le tag :61:
                    line = line.replaceAll('///', '//')
                }
                outputLines << line // Ajoute la ligne du tag :61:
            } else if (line.startsWith(':64:') && insideBlock) {
                outputLines << line // Écrit le tag :64:
                insideBlock = false // Fin du bloc :25:
            } else {
                outputLines << line // Ajoute les autres lignes sans modification
            }
        }
     
        // Écrit le contenu modifié dans le fichier de sortie
     
    	def results = (input =~ outputLines).collect{ writer -> outputLines.each { writer.println(it) }}
    	//def results = input.withWriter { writer -> outputLines.each { writer.println(it) }}
     
     
    		// Sortie
    		new StringReader((results.size() > 0) ? results.join('') : input)

    Est-ce que vous voyez une erreur dans les boucles ou ailleurs?
    Merci

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 135
    Points : 275
    Points
    275
    Par défaut
    Bonjour,
    Je veux bien pouvoir lire sans déchiffrer chaque mot lol ...
    La grande question , pourquoi faire ca?

    Sinon si tu veux voici une erreur si j'ai bien compris :
    La condition if (current25Tag.startsWith(':25: RO')) ne fonctionnera pas correctement car elle vérifie si la ligne entière commence par :25: RO, mais fo vérifier si le contenu après :25: commence par RO.

    Un truc de ce style du coup ?
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (current25Tag.substring(4, 6) == 'RO') {
                // Remplace "///" par "//" dans le tag :61:
                line = line.replaceAll('///', '//')
            }

    Pense à tester dans la mesure du possible un sous ensemble du code. Parce que pas de sortie , pas d'erreur rien ca reviens à chercher une aiguille dans une botte de foin mais sans l'aimant

    Cdt

  3. #3
    Futur Membre du Club
    Femme Profil pro
    analyste fonctionelle
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : analyste fonctionelle
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Points : 9
    Points
    9
    Par défaut nouveau test
    Merci pour la reponse, desolée j'ai pas vu que tous les accents etaient remplacés. ce n'etait pas très lisible.

    J'ai essayé avec une autre méthode mais j'ai encore une erreur :

    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
    30
     
    def input = context.text
    def content = input.text.split('\n')
    def isABFound = false
     
    content.each { line ->
        // Check if the line starts with ":25:" and contains AB
        if (line.startsWith(':25:') && line.contains('AB')) {
            isABFound = true
        }
    }
     
    // If AB founds then, replace in the tag ":61:"
    if (isABFound) {
        content = content.collect { line ->
            if (line.startsWith(':61:')) {
                return line.replaceAll('///', '//')
            }
            return line
        }
    } 
     
    		// Pattern starting with '{1:' containing anything but curly brackets '{' or '}' and ending with '\r\n-}'
    		def pattern = ~/\{1:\r\n([^\{\}]*\r\n)-\}/
     
    		// Collect the second capturing group (= contents of block 1) of all found matches into an array
    		def results = (input =~ pattern).collect{groups -> groups[1]}
     
    		// Return new reader with all array items joined into a String or just return the input when nothing was found
    		new StringReader((results.size() > 0) ? results.join('') : input)

Discussions similaires

  1. Boucle, copie de fichiers, bat
    Par skarun dans le forum Windows
    Réponses: 4
    Dernier message: 19/09/2006, 16h10
  2. Réponses: 2
    Dernier message: 22/05/2006, 01h07
  3. [Oracle] Requête sur 3 tables, sortie fichier
    Par Bast92 dans le forum Langage SQL
    Réponses: 20
    Dernier message: 18/04/2006, 16h33
  4. [langage] demande utilisateur sortie fichier
    Par perlaud dans le forum Langage
    Réponses: 2
    Dernier message: 29/07/2004, 18h23
  5. Réponses: 2
    Dernier message: 29/05/2002, 21h43

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