caramelwilly
Messages postés14Date d'inscriptionmardi 28 juin 2022StatutMembreDernière intervention18 juillet 2022
-
Modifié le 28 juin 2022 à 17:10
Caramelwilly -
8 juil. 2022 à 09:33
Bonjour,
J'ai réalisé un programme afin de convertir un fichier csv en xml mais j'ai une erreur "NullPointerException".
A première vue, je connais cette erreur, j'ai une variable vide que j'utilise et cela crée l'erreur (grossièrement).
Cependant, je ne comprends pas pourquoi j'ai cette erreur dans mon programme, je pense pourtant initaliser ma variable .
J'ai tenté différemment de lui donner une valeur mais rien ne fonctionne.
Pensez-vous pouvoir m'aider?
J'ai du sûrement louper quelque chose...
Merci à vous !
PS : j'ai réalisé 2 classes que je vous mets ci-dessous
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 = ',';
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(100, 100, 470, 440);
frmFaiaPourFidexpert.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmFaiaPourFidexpert.setResizable(false);
JButton btnNewButton = new JButton("Convertir un fichier");
btnNewButton.setBounds(0, 302, 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.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichier .csv","csv");
fichier.addChoosableFileFilter(filter);
int res = fichier.showOpenDialog(null);
// Enregistrez le fichier
if (res == JFileChooser.APPROVE_OPTION) {
String XML;
XML = null;
//File file = fichier.getSelectedFile();
String fi = fichier.getName();
XMLCreators xmlCreators = new XMLCreators();
xmlCreators.convertFile(fi, XML, '\t');
//conversion.XMLCreators.convertFile(String,String,char);
}
;
}
}
});
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(0, 14, 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(0, 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);
}
}
package image;
import com.opencsv.CSVParser;
import com.opencsv.CSVParserBuilder;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class conversion {
public static void main(String[] args) {
new conversion();
}
// public conversion(){
// new XMLCreators().convertFile("Test.csv", "Test.xml", '\t');
//}
public class XMLCreators {
// Protected Properties
protected DocumentBuilderFactory domFactory = null;
protected DocumentBuilder domBuilder = null;
public XMLCreators(){
try {
domFactory = DocumentBuilderFactory.newInstance();
domBuilder = domFactory.newDocumentBuilder();
} catch (FactoryConfigurationError exp) {
System.err.println(exp.toString());
} catch (ParserConfigurationException exp) {
System.err.println(exp.toString());
} catch (Exception exp) {
System.err.println(exp.toString());
}
}
public int convertFile(String csvFileName, String xmlFileName, char delimiter) {
int rowsCount = -1;
BufferedReader csvReader;
try {
Document newDoc = domBuilder.newDocument();
// Root element
Element rootElement = newDoc.createElement("XMLCreators");
newDoc.appendChild(rootElement);
// Read csv file
csvReader = new BufferedReader(new FileReader(csvFileName));
//** Now using the OpenCSV **//
CSVParser parser = new CSVParserBuilder()
.withSeparator(delimiter)
.build();
CSVReader reader = new CSVReaderBuilder(new FileReader(csvFileName))
.withCSVParser(parser)
.build();
//CSVReader reader = new CSVReader(csvReader);
String[] nextLine;
int line = 0;
List<String> headers = new ArrayList<String>(5);
while ((nextLine = reader.readNext()) != null) {
if (line == 0) { // Header row
for (String col : nextLine) {
headers.add(col);
}
} else { // Data row
Element rowElement = newDoc.createElement("row");
rootElement.appendChild(rowElement);
int col = 0;
for (String value : nextLine) {
String header = headers.get(col).replaceAll("[\\t\\p{Zs}\\u0020]", "_");
Element curElement = newDoc.createElement(header);
curElement.appendChild(newDoc.createTextNode(value.trim()));
rowElement.appendChild(curElement);
col++;
}
}
line++;
}
//** End of CSV parsing**//
FileWriter writer = null;
try {
writer = new FileWriter(new File(xmlFileName));
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();
aTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
aTransformer.setOutputProperty(OutputKeys.METHOD, "xml");
aTransformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
Source src = new DOMSource(newDoc);
Result result = new StreamResult(writer);
aTransformer.transform(src, result);
writer.flush();
} catch (Exception exp) {
exp.printStackTrace();
} finally {
try {
writer.close();
} catch (Exception e) {
}
}
// Output to console for testing
// Resultt result = new StreamResult(System.out);
} catch (IOException exp) {
exp.printStackTrace();
} catch (Exception exp) {
exp.printStackTrace();
}
return rowsCount;
// "XLM Document has been created" + rowsCount;
}
}
}
A voir également:
Erreur Java : Je n'arrive pas à retirer mon erreur
KX
Messages postés16754Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 novembre 20243 020 28 juin 2022 à 17:12
Bonjour,
Pourrais tu poster également la stack trace de l'exception, elle indique exactement sur quelle ligne est l'erreur, donc ça aide à savoir quel code pose problème.
KX
Messages postés16754Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 novembre 20243 020
>
caramelwilly
Messages postés14Date d'inscriptionmardi 28 juin 2022StatutMembreDernière intervention18 juillet 2022 29 juin 2022 à 20:13
getName() ne renvoie que le nom du fichier (GL 2017.csv dans l'erreur), donc par défaut Java va le chercher dans son répertoire de travail, où de toute évidence le fichier n'est pas.
Il faudrait plutôt utiliser getSelectedFile() pour récupérer le chemin d'accès complet du fichier (C:/.../GL 2017.csv)
KX
Messages postés16754Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 novembre 20243 020
>
caramelwilly
Messages postés14Date d'inscriptionmardi 28 juin 2022StatutMembreDernière intervention18 juillet 2022 30 juin 2022 à 22:01
Ici on ne sait pas trop ce que tu manipules comme données, le mieux serait d'intercepter l'exception pour l'enrichir de la donnée manipulée lors de l'erreur.
À mon avis ton replaceAll est à revoir, j'ai du mal à comprendre ce que tu essaies de faire avec ta regex, elle est probablement incorrecte d'où ton erreur.
KX
Messages postés16754Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 novembre 20243 020
>
caramelwilly
Messages postés14Date d'inscriptionmardi 28 juin 2022StatutMembreDernière intervention18 juillet 2022 1 juil. 2022 à 11:36
Peut-être qu'il faudrait tout reprendre de zéro plutôt que de copier-coller ici ou là des codes que tu ne comprends pas, alors qu'au final la conversion d'un fichier CSV en XML peut-être relativement simple. Exemple :
CsvToXml.java
import java.io.*;
import java.util.Scanner;
public class CsvToXml {
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("<lines>");
while (sc.hasNextLine()) {
String[] values = sc.nextLine().split(";");
pw.println(" <line>");
for (int i = 0; i < values.length && i < headers.length; i++) {
pw.println(" <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
}
pw.println(" </line>");
}
pw.println("</lines>");
} catch (IOException e) {
throw new UncheckedIOException("Can't convert " + csvFile + " to " + xmlFile, e);
}
}
}
App.java
public class App {
public static void main(String[] args) {
CsvToXml.convert(new File("C:/test.csv"), new File("C:/test.xml"));
}
}
KX
Messages postés16754Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 novembre 20243 020
>
Caramelwilly
1 juil. 2022 à 13:49
Faut-il avoir le fichier xml déjà créé? Non, c'est le programme qui le créé.
je n'ai rien qui s'affiche en retour Mon code n'affiche rien, c'est normal, par contre tu dois avoir un fichier créé, là où tu lui a demandé de s'écrire.
Éventuellement tu peux rajouter des lignes d'affichages dans la console :
KX
Messages postés16754Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 novembre 20243 020
>
caramelwilly
Messages postés14Date d'inscriptionmardi 28 juin 2022StatutMembreDernière intervention18 juillet 2022 4 juil. 2022 à 20:41
Bonjour,
Tu peux faire quelque chose comme ça :
File dir = new File("C:/Users/33781/Desktop/stage/fichier_d");
File output = new File(dir, "output.xml");
for (int i=1; output.exists(); i++) {
output = new File(dir, "output_" + i + ".xml");
}
conversion.convert(file, output);
29 juin 2022 à 20:13
Il faudrait plutôt utiliser getSelectedFile() pour récupérer le chemin d'accès complet du fichier (C:/.../GL 2017.csv)
30 juin 2022 à 22:01
Exemple :
À mon avis ton replaceAll est à revoir, j'ai du mal à comprendre ce que tu essaies de faire avec ta regex, elle est probablement incorrecte d'où ton erreur.
1 juil. 2022 à 11:36
CsvToXml.java
App.java
C:/test.csv
C:/test.xml
1 juil. 2022 à 13:49
Non, c'est le programme qui le créé.
je n'ai rien qui s'affiche en retour
Mon code n'affiche rien, c'est normal, par contre tu dois avoir un fichier créé, là où tu lui a demandé de s'écrire.
Éventuellement tu peux rajouter des lignes d'affichages dans la console :
4 juil. 2022 à 20:41
Tu peux faire quelque chose comme ça :