JAVA: convertir plusieurs fichiers en même temps

Fermé
caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022 - 11 juil. 2022 à 11:29
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 18 juil. 2022 à 20:36

Bonjour,

J'ai réalisé un convertisseur de fichier csv à xml sur Java (avec une interface graphique) mais mon covnertisseur fonctionne que fichier par fichier.

J'aimerais pouvoir sélectionner plusieurs fichiers et les convertir en les séparant par section (le xml) et ressortir un seul fichier xml.

exemple :

<General>

       <section 1>

        fichier1 converti

        </Section1>

        <section2>

        fichier2 converti

        </section2>

        <section3>

        fichier3 converti

        </section3>

</general>

Je vous donne  donc les deux classes que j'ai déjà réalisé :

package image;

import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Window.Type;

import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;

import com.opencsv.exceptions.CsvException;

//import image.conversion.XMLCreators;

import java.awt.Button;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.awt.event.ActionEvent;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class fenetre extends conversion {
	//char t = ',';
	int i=1;;
	int k=0;
	int j=0;
	private JFrame frmFaiaPourFidexpert;
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					fenetre window = new fenetre();
					window.frmFaiaPourFidexpert.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public fenetre() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmFaiaPourFidexpert = new JFrame();
		frmFaiaPourFidexpert.setBackground(new Color(245, 222, 179));
		frmFaiaPourFidexpert.setTitle("FAIA pour FID-Expert");
		frmFaiaPourFidexpert.setForeground(Color.BLACK);
		frmFaiaPourFidexpert.setIconImage(Toolkit.getDefaultToolkit().getImage(fenetre.class.getResource("/image/lux.png")));
		frmFaiaPourFidexpert.setBounds(400, 150, 550, 520);
		frmFaiaPourFidexpert.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmFaiaPourFidexpert.setResizable(false);
		
		JButton btnNewButton = new JButton("Convertir un fichier");
		btnNewButton.setBounds(41, 376, 456, 29);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String s = e.getActionCommand();
			  
				
				
			    if (s.equals("Convertir un fichier")) {
			    	JFileChooser fichier = new JFileChooser( FileSystemView.getFileSystemView().getHomeDirectory());
			    	fichier.setDialogTitle("Choississez votre fichier .csv");
			    	fichier.setMultiSelectionEnabled(true);
			    	fichier.setAcceptAllFileFilterUsed(false);
			    	FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichier.csv","csv");
			    	fichier.addChoosableFileFilter(filter);
			    	int res = fichier.showOpenDialog(null);
			        // Enregistrez le fichier
			    	File  file = fichier.getSelectedFile();
			        if (res == JFileChooser.APPROVE_OPTION) {
			        	File[] files = fichier.getSelectedFiles();
			        	for (j=0; j<files.length ;j++) {
			        		String fis = files[j].getName();
			        		File dir = new File("C:\\Users\\33781\\Desktop\\stage\\fichier_d");
			          File FAIA = new File(dir, fis+".xml");
			          for (int i=1; FAIA.exists(); i++) {
			        	  FAIA= new File(dir, fis+i+".xml");
			          }
			          conversion.convert(file, FAIA);
			        		}
			        	
			          //String output;
			          //output = "outputfile.xml";
			          
			          
			          
			          File test = fichier.getCurrentDirectory();
			          String fi = fichier.getName(file);
			          
			          
			          
			          
			          
			          //else {
			        	//  conversion.convert(file, new File ("C:\\Users\\33781\\Desktop\\stage\\fichier_d\\output"+i+".xml"));
			          //}
   
		        }
			     ;
			      
			    }
			}
		});
		frmFaiaPourFidexpert.getContentPane().setLayout(null);
		btnNewButton.setForeground(Color.BLACK);
		btnNewButton.setFont(new Font("Yu Gothic UI", Font.BOLD, 14));
		btnNewButton.setBackground(new Color(168, 146, 28));
		frmFaiaPourFidexpert.getContentPane().add(btnNewButton);
		
		JLabel lblNewLabel = new JLabel("");
		lblNewLabel.setBounds(41, 24, 456, 328);
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setIcon(new ImageIcon(fenetre.class.getResource("/image/fid.png")));
		frmFaiaPourFidexpert.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("                      "
				+ "Conversion fichier pour FAIA");
		lblNewLabel_1.setBounds(41, 0, 456, 24);
		lblNewLabel_1.setBackground(new Color(218, 165, 32));
		lblNewLabel_1.setFont(new Font("Microsoft New Tai Lue", Font.BOLD, 18));
		frmFaiaPourFidexpert.getContentPane().add(lblNewLabel_1);
		
		JMenuBar menuBar = new JMenuBar();
		frmFaiaPourFidexpert.setJMenuBar(menuBar);
		
		JMenu mnNewMenu = new JMenu("Aide");
		JMenuItem menuItem = new JMenuItem("?");
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String w = e.getActionCommand();
				JFrame frame = new JFrame();
				if (w.equals("?")) {
					JDialog d = new JDialog(frame, "Aide");
					JLabel l = new JLabel("Le bouton convertit un fichier .csv en .xml directement sur votre PC");
					d.getContentPane().add(l);
					d.setIconImage(Toolkit.getDefaultToolkit().getImage(fenetre.class.getResource("/image/lux.png")));
					d.setSize(400,100);
					d.setVisible(true);
				}
			}
		});
		mnNewMenu.add(menuItem);
		menuBar.add(mnNewMenu);
	}

}
//vérifier la boucle while, et refaire du if si c mieux. ==> la boucle FOR était la meilleure

package image;
import java.io.*;
import java.util.Scanner;

public class conversion {
	static int i=0;
    public static void convert(File csvFile, File xmlFile) {
        try (Scanner sc = new Scanner(csvFile); PrintWriter pw = new PrintWriter(xmlFile)) {
            String[] headers = sc.nextLine().split(";");
            pw.println("<AuditFile>");
            System.out.println(csvFile.getName());
            if (csvFile.getName()=="fiche_header") {
                String[] values = sc.nextLine().split(";");
                pw.println("  <Header>");
                
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </Header>");
                
            }
            if (csvFile.getName()=="fiche_fournisseur.csv" || csvFile.getName()== "MF") {
            	while (sc.hasNextLine()){ 
            		
            	
                String[] values = sc.nextLine().split(";");
                pw.println("  <section2>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </section2>");
                }
            } 
            if (csvFile.getName()=="GLE") {
                String[] values = sc.nextLine().split(";");
                pw.println("  <section3>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </section3>");
                
            }
            pw.println("</AuditFile>");
            
        } catch (IOException e) {
            throw new UncheckedIOException("Can't convert " + csvFile + " to " + xmlFile, e);
        }
    }
}
// trouver comment "trier les fichiers" pour faire un beau XML à la fin
//faire un if for while?

Pour l'instant, le résultat me renvoie un xml quasiment vide (avec une seule section).

J'aimerais que vous m'aidiez à savoir comment bien réalisé mon code.

Je pensais faire un if puis un while puis un for pour chaque fichier, mais ça me parait bien trop complexe...

Merci de votre aide!
Windows / Firefox 102.0

A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 juil. 2022 à 19:51

Bonjour,

Pour commencer, il faudrait changer la signature de ta méthode pour qu'elle prenne en paramètres plusieurs fichier.

Exemple : 

public static void convert(Map<String, File> csvFiles, File xmlFile) {

Après, il faut rajouter une boucle qui itère sur tes différents fichiers CSV pour rajouter un niveau dans l'arborescence de ton XML :

try (PrintWriter pw = new PrintWriter(xmlFile)) {
    pw.println("<AuditFile>");
    for (Entry<String, File> entry : csvFiles.entrySet()) {
        pw.println("  <" + entry.getKey() + ">");
        try (Scanner sc = new Scanner(entry.getValue())) {
            String[] headers = sc.nextLine().split(";");
            while (sc.hasNextLine()) {
                String[] values = sc.nextLine().split(";");
                pw.println("    <Header>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("      <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("    </Header>");
            }
        }
        pw.println("  </" + entry.getKey() + ">");
    }
    pw.println("</AuditFile>");
} catch (IOException e) {
    throw new UncheckedIOException("Can't convert " + csvFiles + " to " + xmlFile, e);
}

Code de test :

public static void main(String[] args) {
    convert(Map.of(
        "toto", new File("G:/toto.csv"),
        "tata", new File("G:/tata.csv")
    ), new File("G:/test.xml"));
}

1
caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
13 juil. 2022 à 10:09

Merci pour votre réponse!

Je pense comprendre comment le programme procède.

Je ne connaissais pas du tout la collection Map avant.

Lors du test, j'ai un petit soucis cependant, que je comprends pas ;

J'ai mis cette ligne de code dans ma classe fenêtre "conversion.convert(Map.of("t1", file,"t2", file), FAIA);" mais alors une erreur apparait : "The method of(String, File, String, File) is undefined for the type Map".

J'ai peut être fait un mauvais import?

J'ai pourtant ces deux la :

import java.util.Map;
import java.util.Map.Entry;

J'ai un peu de mal à comprendre.

De plus, pour avoir le nom des fichiers choisis avec JFileChooser, est il possible de faire une liste de fichier ? Du type "File[]" et File[0] == premier fichier choisi par JFileChooser, File[1] == le deuxième etc...

Afin de pouvoir faire un "File[i].getName();. et de pouvoir au mieux cibler mes fichiers?

Merci à vous.

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
Modifié le 13 juil. 2022 à 15:08
  • "The method of(String, File, String, File) is undefined for the type Map"

Dans quelle version de Java est-ce que tu compiles ?

Les méthodes Map.of() existent depuis Java 9, avant il faudrait faire quelque chose comme ceci :

Map<String, File> map = new LinkedHashMap<>();
map.put("tata", new File("G:/tata.txt"));
map.put("toto", new File("G:/toto.txt"));

Remarque : la dernière version c'est Java 18 (et la dernière LTS : Java 17)

  • "pour avoir le nom des fichiers choisis avec JFileChooser, est il possible de faire une liste de fichier ?"

Oui, mais tu dois utiliser la méthode File[] getSelectedFiles() au lieu de File getSelectedFile()

1
caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
15 juil. 2022 à 09:37

Bonjour!

Désolé de ma réponse tardive!

Votre aide m'est très précieuse!

Cela fonctionne comme je veux, cependant j'ai une question, est-il possible, avec

Map<String, File> de créer des sous section parmi nos sections? 

Par ailleurs, si mon "conversion.convert(Map.of("t1", file,"t2", file), FAIA);" ne fonctionnait pas, c'était bien à cause de la version de Java que j'utilisais! Je me suis donc mis à jour !

Merci beaucoup!

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
15 juil. 2022 à 10:38

Bonjour,

Techniquement on pourrait faire des Map<String, Map<String, File>> mais je ne sais pas si c'est très pertinent pour ton programme.

Au départ on avait une conversion d'un fichier CSV (avec une section pour chacune de tes colonnes) vers un fichier XML, avec une Map on avait une conversion de plusieurs fichiers vers un même fichier XML (avec une section pour chacun de tes fichiers), maintenant tu veux rajouter encore une section mais elle représenterait quoi dans tes fichiers CSV ?

Si tu veux complexifier ton fichier XML (quitte à mettre de côté la partie CSV) on peut soit revenir aux DocumentBuilder comme tu avais dans ta première discussion, soit passer par une classe perso qui permet de gérer tes différents niveaux d'imbrication.

Exemple :

abstract class XmlData {
    String name;
}

class XmlValue extends XmlData {
    String value;
}

class XmlSection extends XmlData {
    List<XmlData> datas;
}
0
caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
15 juil. 2022 à 11:54

En fait, je voudrais avoir mon document comme suit XML :

<section1>

   <sous_section1>

       fichier1

   </sous_section1>

   <sous_section2>

   fichier1

   <sous_section2>

</section1>

Et les sections me permettraient de décomposer une section du type : (c'est un exemple)

Ma première section = MasterFile

Ce que je mets dans mon MasterFIle:

Sous section 1 : info sur fournisseur

Sous section 2 : info sur client

sous section 3 :...

Après si c'est fastidieux ou non pertinent niveau programme, ce n'est pas très grave de ne pas avoir ces sous-sections. 

Merci de votre aide!

0