lectorarchivos.VerCSV.java Source code

Java tutorial

Introduction

Here is the source code for lectorarchivos.VerCSV.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package lectorarchivos;

/*Se ha creado una libreria la cual tiene el jar
 para que a la hora de abrir el proyecto en otro pc
no tengamos que importar la libreria.
*/

import Clases.Contador;
import com.opencsv.CSVReader;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JTable;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;

/**
 *
 * @author MGC
 */
public class VerCSV extends javax.swing.JPanel {
    File fichero = null;
    private static DefaultTableModel model;
    private static Set codigoContadores = new HashSet();
    private static Set nombreContadores = new HashSet();
    private static String rutaFichero;

    /**
     * Creates new form VerCSV
     */
    public VerCSV(File fichero) throws IOException {
        initComponents();
        this.fichero = fichero;
        //jLabelRutaFichero.setText(fichero.getAbsolutePath().toString());

        //LLamamos al metodo para llenar la tabla
        /*
        Tendremos que pasarle la tabla y el la ruta
        del fichero
        */
        llenarTabla(jTableInfoCSV, fichero);

    }

    public static void llenarTabla(JTable tabla, File fichero) throws FileNotFoundException, IOException {
        //Almacenamos la direccion donde se encuenta el fichero en un String
        String rutaFichero = fichero.getAbsolutePath().toString();
        BufferedReader br = null;
        String line = "";
        //Asignar un separador
        char csvSplitBy = ';';
        char quote = '"';
        CSVReader reader = null;

        //Realizar lectura del fichero para coger los titulos
        String titulos[] = new String[5];

        titulos[0] = "Fecha";
        titulos[1] = "Hora";
        titulos[2] = "Nmero de serie";
        titulos[3] = "Lectura";
        titulos[4] = "Consumo";

        //Array de filas
        String col[] = new String[5];

        //Creacion del modelo
        model = new DefaultTableModel(null, titulos);

        //Recoger fecha del item actual en string
        String fechaActual = null;
        //Recoger la fecha anterior en un string
        String fechaAnterior = null;

        //Recoger las lecturas
        String lecturaActual = null;
        String lecturaAnterior = null;

        //Consumo
        double consumo = 0;

        //Lectura del fichero
        try {
            reader = new CSVReader(new FileReader(rutaFichero), csvSplitBy, quote);
            String[] nextLine = null;

            while ((nextLine = reader.readNext()) != null) {
                //System.out.println(Arrays.toString(nextLine));
                //Asignar a cada fila el valor
                col[0] = nextLine[0];//Lnea de la fecha Actual
                col[1] = nextLine[1];
                col[2] = nextLine[2];//Nmero de serire

                col[3] = nextLine[12];//Lectura
                col[4] = nextLine[11];//Consumo

                if (fechaActual == null && lecturaActual == null) {
                    //Aqu se asigna la fecha actual;
                    fechaActual = col[0];
                    //Aqu se le asigna la lectura actual
                    //lecturaActual = col[3];
                } else {
                    //Se le asigna la fecha a fechaAnterior
                    fechaAnterior = col[0];
                    //Aqu se le asigna la lectura anterior
                    //lecturaAnterior = col[3];

                    //Comprobar fechActual con anterior
                    if (fechaActual.compareTo(fechaAnterior) == 1) {
                        //La fecha sera menor
                    } else if (fechaActual.compareTo(fechaAnterior) == -1) {
                        //Es que la fecha es mayor
                    } else {
                        //La fecha es menor
                    }

                    //Mostrar fecha actual y menor
                    System.out.println("Fecha actual --> " + fechaActual);
                    System.out.println("Fecha anterior --> " + fechaAnterior);
                    System.out.println("----------------------------------------");

                    //Antes de vaciar nada sacamos el consumo de cada cosa
                    //consumo = Double.parseDouble(lecturaActual)-Double.parseDouble(lecturaAnterior);

                    //Ahora asignamos el consumo a la col[4];
                    //col[4] = String.valueOf(consumo);

                    //Vaciamos las acturales fecha y lectura
                    fechaActual = null;

                }

                //Aadimos la columna al modelo
                model.addRow(col);
            }

            ArrayList<Double> consumoRecogido = new ArrayList<Double>();

            //Recorrer el modelo
            for (int i = 0; i < model.getRowCount(); i++) {
                codigoContadores.add(model.getValueAt(i, 2).toString());

                if (lecturaActual == null) {
                    lecturaActual = model.getValueAt(i, 3).toString();
                    System.out.println("Lectura actual --> " + lecturaActual);
                } else {
                    lecturaAnterior = model.getValueAt(i, 3).toString();
                    System.out.println("Lectura anterior --> " + lecturaAnterior);

                    //Lectura anterior - actual = consumo
                    consumo = Double.parseDouble(lecturaActual) - Double.parseDouble(lecturaAnterior);
                    System.out.println("Consumo = " + consumo);

                    //Insertamos el consumo dentro de un arraylist
                    consumoRecogido.add(consumo);

                    //model.setValueAt(consumo, i, 4);

                    System.out.println("---------------------------------------------------");

                    lecturaActual = lecturaAnterior;
                }
            }
            consumoRecogido.add(0.0);

            System.out.println(consumoRecogido.toString());
            System.out.println(model.getRowCount());

            //Ahora vamos metiendo el consumo recogido dentro del modelo
            for (int i = 0; i < consumoRecogido.size(); i++) {
                model.setValueAt(consumoRecogido.get(i).toString(), i, 4);
            }

            //Recorrer array de codigoContadores
            System.out.println("Tamao de la lista de numContadores: " + codigoContadores.size());
            System.out.println("Datos del array: " + codigoContadores.toString());

            //Leer el XML para mostrar el nombre del contador
            leerXML();

            //Editar el modelo de la tabla
            tabla.setModel(model);

            //Llamamos al mtodo para mostrar la grfica
            mostrarGrafica(jTableInfoCSV);

        } catch (Exception e) {

        } finally {
            if (null != reader) {
                reader.close();
            }
        }
    }

    public static void leerXML() {
        LeerXML xml = new LeerXML("C:/Users/mgc/Desktop/DescargaContadores0.xml");
        Enumeration e = xml.leerXML().keys();
        Object clave;
        Object valor;

        if (!xml.equals(null)) {
            while (e.hasMoreElements()) {
                clave = e.nextElement();
                valor = xml.leerXML().get(clave);
                System.out.println(clave + " " + valor);
                Contador cont = new Contador(clave.toString(), valor.toString());
                //Ver si algun elemento del array de codigoContadores coincide con el codigo del objeto contador
                Iterator iterator = codigoContadores.iterator();
                while (iterator.hasNext()) {
                    //String codigo = (String) iterator.next();
                    //Comprobar el codigo coincide con el objeto
                    if (cont.getNumSerie().equals((String) iterator.next())) {
                        //Ahora meter el nombre en otro iterator con los nombres
                        //jComboBoxContador.addItem(cont.getNombrePila());
                        nombreContadores.add(cont.getNombrePila());
                    }
                }
            }

            Iterator iter = nombreContadores.iterator();
            while (iter.hasNext()) {
                String nombre = (String) iter.next();
                jComboBoxContador.addItem(nombre);
            }

        } else {
            System.out.println("No se ha podido encontrar el archivo xml");
            try {
                //Insertaremos un browser file para que el usuario pueda buscar el fichero
                xml = new LeerXML(abrirSelectorXML());
                while (e.hasMoreElements()) {
                    clave = e.nextElement();
                    valor = xml.leerXML().get(clave);
                    System.out.println(clave + " " + valor);
                }
            } catch (IOException ex) {
                Logger.getLogger(principal.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    //Crear metodo para mostrar la grfica
    public static void mostrarGrafica(JTable jTableInfoCSV) {
        //Fuente de datos
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        //Recorremos la columna del consumo de la tabla
        for (int i = jTableInfoCSV.getRowCount() - 1; i >= 0; i--) {
            if (Double.parseDouble(jTableInfoCSV.getValueAt(i, 4).toString()) > 0)
                dataset.setValue(Double.parseDouble(jTableInfoCSV.getValueAt(i, 4).toString()), "Consumo",
                        jTableInfoCSV.getValueAt(i, 0).toString());
        }

        //Creando el grfico
        JFreeChart chart = ChartFactory.createBarChart3D("Consumo", "Fecha", "Consumo", dataset,
                PlotOrientation.VERTICAL, true, true, false);
        chart.setBackgroundPaint(Color.cyan);
        chart.getTitle().setPaint(Color.black);
        chart.setBackgroundPaint(Color.white);
        chart.removeLegend();

        //Cambiar color de barras
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        BarRenderer barRenderer = (BarRenderer) plot.getRenderer();
        barRenderer.setSeriesPaint(0, Color.decode("#5882FA"));

        // Mostrar Grafico
        ChartFrame frame = new ChartFrame("CONSUMO", chart);
        frame.pack();
        frame.getChartPanel().setMouseZoomable(false);
        frame.setVisible(true);

        panel.add(frame);

    }

    //Crear mtodo para abrir selector
    public static String abrirSelectorXML() throws IOException {
        JFileChooser selector = new JFileChooser();
        FileNameExtensionFilter filtroArchivo = new FileNameExtensionFilter("csv & xls & txt", "csv", "xls", "txt");
        selector.setFileFilter(filtroArchivo);
        selector.setFileSelectionMode(JFileChooser.FILES_ONLY);
        selector.setMultiSelectionEnabled(false);

        //int r=selector.showOpenDialog(this);

        /*if(r==JFileChooser.APPROVE_OPTION){
        //Recorremos el array de ficheros seleccionados
        rutaFichero = selector.getSelectedFile().toPath().toAbsolutePath().toString(); 
        }else{
        System.out.println("Yo devuelvo nullo");
        }*/
        return rutaFichero;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTableInfoCSV = new javax.swing.JTable();
        jButtonVerGrafica = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jComboBoxContador = new javax.swing.JComboBox<>();
        panel = new javax.swing.JPanel();

        jTableInfoCSV.setModel(new javax.swing.table.DefaultTableModel(
                new Object[][] { { null, null, null, null, null }, { null, null, null, null, null } },
                new String[] { "Fecha", "Hora", "Nmero de serie", "Lectura", "Contador" }) {
            boolean[] canEdit = new boolean[] { false, false, false, false, false };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit[columnIndex];
            }
        });
        jScrollPane1.setViewportView(jTableInfoCSV);

        jButtonVerGrafica.setText("Ver Grfica");
        jButtonVerGrafica.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonVerGraficaActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
        jLabel1.setText("Seleccionar contador");

        javax.swing.GroupLayout panelLayout = new javax.swing.GroupLayout(panel);
        panel.setLayout(panelLayout);
        panelLayout.setHorizontalGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 0, Short.MAX_VALUE));
        panelLayout.setVerticalGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 331, Short.MAX_VALUE));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                javax.swing.GroupLayout.Alignment.TRAILING,
                layout.createSequentialGroup().addGap(40, 40, 40).addGroup(layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 640, Short.MAX_VALUE)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 186,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jComboBoxContador, javax.swing.GroupLayout.PREFERRED_SIZE, 313,
                                javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 396, Short.MAX_VALUE)
                        .addComponent(jButtonVerGrafica).addContainerGap()));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addGap(30, 30, 30).addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jComboBoxContador, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 245,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jButtonVerGrafica).addContainerGap())
                                .addGroup(layout.createSequentialGroup().addGap(18, 18, 18)
                                        .addComponent(panel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addContainerGap(32, Short.MAX_VALUE)))));
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonVerGraficaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonVerGraficaActionPerformed
        MostrarGraficaCSV grafica = new MostrarGraficaCSV(jTableInfoCSV);
        grafica.setResizable(false);
        grafica.setVisible(true);
    }//GEN-LAST:event_jButtonVerGraficaActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonVerGrafica;
    public static javax.swing.JComboBox<String> jComboBoxContador;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private static javax.swing.JTable jTableInfoCSV;
    private static javax.swing.JPanel panel;
    // End of variables declaration//GEN-END:variables

}