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

avec Java Discussion :

Supprimer les sauts de ligne dans les champs texte d'un csv


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Apprenti Ingénieur généraliste
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti Ingénieur généraliste

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut Supprimer les sauts de ligne dans les champs texte d'un csv
    Bonjour à tous, c'est la première fois que je poste sur un forum, merci d'être indulgent .

    Je cherche à importer des données CSV dans l'ERP de mon entreprise et j'ai besoin de les mettre en forme. En effet, des sauts de ligne présents dans les champs texte sont interprétés comme des sauts de ligne du tableau.
    J'ai déjà pas mal cherché de solution et j'ai écris un programme :
    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
    40
    41
    42
    43
    44
     
    import java.io.FileWriter;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
     
    public class test 
    {
    	public static void main(String[] args)  
    	throws IOException
    	{
    		String dataOld = new String(Files.readAllBytes(Paths.get("c:\\test.csv")));
    		//System.out.println(dataOld);
     
    		int nbCara=dataOld.length();
    		//System.out.println(nbCara);
    		int i=0,j=0,k=0;
     
    		while (i < nbCara-2) //Tant que le pointeur n'est pas à la fin du String (-1)
    		{
    			j=dataOld.indexOf((char)34,i); //Recherche le début du champ texte " à partir du caractère n° i
    			//System.out.print("j :");
    			//System.out.println(j);
     
    			k=dataOld.indexOf((char)34,j+1); //Recherche la fin du champ texte " à partir du début de ce champ 
    			//System.out.print("k :");
    			//System.out.println(k);
     
    			String champ = dataOld.substring(j,k+1); //Extrait les caractères du champ texte
    			//System.out.println(champ);
     
    			if (champ.contains("[\r\n]+"))	//Si le champ contient un saut de ligne
    			{
    				champ = champ.replaceAll("[\r\n]+"," "); // Remplacer le saut de ligne par un espace
    			}
     
    			FileWriter fw = new FileWriter("c:\\test1.csv",true); //écris dans un autre fichier
    			fw.write(champ+';');					      //Le champ + le séparateur
    			fw.close();
    			i=k+1;							      //On incrémente le pointeur de la position de fin du champ +1
    			//System.out.println(i);
    		}
    	}
    }
    Le problème est que je retrouve mes , séparatrices en sortie et je ne vois pas comment faire autrement pour ne pas les avoir.
    Merci beaucoup pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut
    Bonjour,
    Avec la méthode readAllBytes de la classe Files, vous lisez puis stockez l'intégralité de votre fichier CSV dans une seule chaîne. Du coup, dans la même chaîne, vous vous retrouvez dans l'obligation de distinguer les retours chariot faisant parti de l'information des retours chariot correspondant aux sauts de lignes du fichier CSV. En fait, vous vous compliquez la vie.
    Je penses que le plus simple serait de lire concrètement le fichier CSV ligne par ligne, et de s'attacher à parser uniquement les lignes.
    Ainsi, les retours chariots trouvés dans une ligne lue seront forcément des retours chariot faisant parti de l'information. Des retours chariots qui ne vous conduiront pas à les reproduire dans votre fichier texte en sortie.
    C'est lorsque vous lisez la ligne suivante que dans le fichier texte vous intégrerez un retour chariot. Pour cela, il suffit de créer une instance de File sur votre fichier CSV, puis de créer une instance de BufferedReader sur ce File. La classe BufferedReader possède une méthode de lecture très pratique, readLine(), qui renvoi une ligne entière sous forme de chaîne. Chaque invocation de readline permet de passer à la ligne suivante.
    Malheureusement, je dois bouger maintenant. Mais si vous voulez, je peux vous écrire un petit code exemple.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Mais... Tu vas pas trouver de retour chariot dans une ligne, puisque tu lis ligne par ligne -_-°. S'il y avait un retour chariot dans cette ligne, ça aurait en réalité fait deux lignes.

    Le problème de Razyor c'est cette ligne-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (champ.contains("[\r\n]+"))	//Si le champ contient un saut de ligne
    Elle ne vérifie absolument pas si un champ contient un saut de ligne.

    Elle vérifie si un champ contient une séquence de 5 caractères, qui sont dans cet ordre:

    • le caractère [
    • Le caractère retour chariot \r
    • Le caractère nouvelle ligne \n
    • Le caractère ]
    • Le caractère +


    Ce qui n'est pas ce dont il a besoin.

    Il fallait bien sûr utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(champ.contains("\r") || champ.contains("\n")) {	//Si le champ contient un saut de ligne
    ou bien avec une regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(champ.matches(".*[\r\n].*")) {	//Si le champ contient un saut de ligne
    Ou genre définir un Pattern :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final Pattern END_OF_LINE = Pattern.compile("[\r\n]");
    et s'en servir ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(END_OF_LINE.matcher(champ).find()) {	//Si le champ contient un saut de ligne
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Candidat au Club
    Homme Profil pro
    Apprenti Ingénieur généraliste
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti Ingénieur généraliste

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut
    Bonjour à tous les deux et merci pour votre aide. Je viens de me rendre compte en affichant les caractère de fin de ligne sur NotePad++ que mes sauts de lignes csv étaient de la forme \r\n alors que mes sauts de lignes contenu dans mes champs, ceux que je veux supprimer, sont de la forme \n.
    J'ai donc juste à supprimer tous les \n et mon fichier sera de la forme souhaitée. J'ai réalisé ce programme qui est fonctionnel:

    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
    import java.io.FileWriter;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Scanner;
     
    public class suppr {
     
    	public static void main(String[] args) 
    	throws IOException
    	{
    		Scanner sc = new Scanner(System.in);
    		System.out.println("Entrer le nom du fichier csv dans le quel vous voulez supprimer les retours à la ligne dans les champs texte:");
    		String nomFichier = sc.nextLine();
     
    		String dataOld = new String(Files.readAllBytes(Paths.get("c:\\Users\\XXX\\Desktop\\"+nomFichier+".csv")));
    		dataOld = dataOld.replaceAll("\n","");
    		String dataNew = dataOld.replaceAll(",",";");
    		FileWriter fw = new FileWriter("c:\\Users\\XXX\\Desktop\\"+nomFichier+"1.csv",true);
    		fw.write(dataNew);
    		fw.close();
    	}
     
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/07/2016, 10h36
  2. [CR XI] Supprimer double saut de ligne dans un champ texte
    Par Cereal123 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 04/12/2015, 17h39
  3. ETAT - Ignorer les sauts de ligne dans un champ mémo
    Par superseba888 dans le forum Access
    Réponses: 4
    Dernier message: 14/08/2006, 03h27
  4. Réponses: 2
    Dernier message: 12/02/2006, 16h42
  5. Réponses: 9
    Dernier message: 23/05/2005, 10h35

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