/**
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