/** Une solution au TP DA 2002-2003 - implémentation avec une collection de type List Olivier Capuoozzo - 13 septembre 2002 */ import java.io.*; import java.util.*; public class VentesCSVtoXMLFile { // format d'un ligne du fichier CSV : public;code;qte;;mois;annee[;commentaire] List listeProduitsMois; // une liste des produits mis à jour durant la lecture du fchier csv. String nameFileSource; // nom du fichier csv à traiter String nameFileDest; // nom du fichier résultat // construteur public VentesCSVtoXMLFile(String nameFile) { nameFileSource = nameFile; nameFileDest = changeExtension(nameFileSource, "xml"); listeProduitsMois = new ArrayList(); } // définition d'une classe interne. // Une instance de la classe englobante pourra exercer un // acces direct aux attributs des objets de cette classe, même // si ceux-ci sont déclarés privé (private). class ProduitMois { private String _public; private String _code; private int _qte; private String _mois; private String _annee; private String _commentaire; private String _cle; ProduitMois(String[] infosproduit) { System.out.println(infosproduit.length); _public=infosproduit[0]; _code=infosproduit[1]; _qte=Integer.parseInt(infosproduit[2]); _mois=infosproduit[3]; _annee=infosproduit[4]; if (infosproduit.length>5) _commentaire=infosproduit[5]; else _commentaire=""; _cle = _code.trim().toUpperCase() + _mois.trim().toUpperCase() + _annee.trim().toUpperCase(); } void update(ProduitMois produitAvecMemeCle) { // assert(this._cle.equals(produitAvecMemeCle._cle)); this._qte += produitAvecMemeCle._qte; this._commentaire += produitAvecMemeCle._commentaire; } public String toString() { return " \r\n" +" "+ this._public + "\r\n" +" " + this._qte + "\r\n" +" " + this._code + "\r\n" +" " + this._mois + "\r\n" +" " + this._annee + "\r\n" +" " + this._commentaire + "\r\n" +" \r\n"; } public boolean equals(Object o) { if (this==o) return true; if (getClass()==o.getClass()) { ProduitMois p = (ProduitMois) o; return _cle.equals(p._cle); } return false; } }//ProduitMois // méthodes /** @param nameFile le nom du fichier initial @param newExt la nouvelle extension @return le nom du fichier initial avec une nouvelle extension. Dans le cas où il n'y a pas d'extension dans le nom initial, l'extension est ajoutée. exemple : changeExtension("toto.txt", "xml") rend "toto.xml" exemple : changeExtension("toto", "xml") rend "toto.xml" exemple : changeExtension("", "xml") rend ".xml" */ public String changeExtension(String nameFile, String newExt) { String res; int posPt = nameFile.lastIndexOf('.'); if (posPt > 0) res = nameFile.substring(0, posPt) + "." + newExt; else res = nameFile + "." + newExt; return res; } protected String debutXML(){ return " \r\n" + "\r\n" + "\r\n"; } protected String finXML(){ return "\r\n"; } /** Recherche un produit ayant la même clé que le produit passé en argument. Un produit est identifié par son code, mois et année. Nous nommons _cle la concaténation de ces attributs dans la classe ProduitMois. @param unProd le produit à rechercher dans la liste. @return la référence au premier objet trouvé dans la liste ayant même clé que unProd. Retourne null si non trouvé. */ private ProduitMois getProduitMoisMemeCleDansListe(ProduitMois unProd) { int nbProd = listeProduitsMois.size(); for (int i=0; i < nbProd ; i++) { if (unProd.equals(listeProduitsMois.get(i))) return (ProduitMois) listeProduitsMois.get(i); } return null; } /** Met à jour la liste des produits. @param nouveauProduitCandidat, un représentant d'une ligne du fichier csv Si un produit de meme cle est déja présent dans la liste, celui-ci est mis à jour, sinon nouveauProduitCandidat est ajouté à la liste. */ protected void updateListeProduitsMois(ProduitMois nouveauProduitCandidat){ ProduitMois produitMemeCle = getProduitMoisMemeCleDansListe(nouveauProduitCandidat); if (produitMemeCle != null) { produitMemeCle.update(nouveauProduitCandidat); } else { listeProduitsMois.add(nouveauProduitCandidat); } } public void go() { try { FileReader fr = new FileReader(nameFileSource); BufferedReader br = new BufferedReader(fr); File file = new File(nameFileDest); if (file.exists()) { BufferedReader clav = new BufferedReader(new InputStreamReader(System.in)); System.out.print(nameFileDest + " existe, voulez-vous l'écraser ? (O/N) : "); String rep = clav.readLine(); if (rep == null) rep = "N"; if (!("O".equals(rep.toUpperCase()))){ return; } } PrintWriter out = new PrintWriter(new FileWriter(nameFileDest)); String line; while ((line = br.readLine()) != null) { updateListeProduitsMois(new ProduitMois(line.split(";"))); } out.print(debutXML()); Iterator iterateur = listeProduitsMois.iterator(); while (iterateur.hasNext()) { out.print(iterateur.next()); } out.print(finXML()); out.flush(); } catch (java.io.FileNotFoundException e){ System.out.println(nameFileSource + " : fichier introuvable."); } catch (ArrayIndexOutOfBoundsException e){ System.out.println(nameFileSource + " : mauvais format de fichier."); } catch (java.io.IOException e) { System.out.println(e); } } // go public static void main (String[] args) { if (args.length == 1) new VentesCSVtoXMLFile(args[0]).go(); else System.out.println("USAGE : " + new VentesCSVtoXMLFile("").getClass().getName() + " nomFivchierCSVventes"); } } // VentesCSVtoXMLFile