OpenCSV:可以同时拥有两个读者吗?

时间:2017-09-05 07:59:51

标签: java file csv nullpointerexception opencsv

大家早上好。

我不是在问什么是NullPointerException。我问是否有人知道,在OpenCSV的特定情况下,如果可以同时创建两个读者。

我正在尝试制作一个比较不同CSV文件上两列的程序。

所以,我所做的是打开两个读者,(类别和产品),然后比较它们并做一些事情。

因此,程序总结是:初始化所有内容,创建对象。然后我有两个循环(我需要将每个产品与所有类别进行比较)。 第一个循环完美运行,已经过测试。 但是当程序尝试开始读取第二个文件时,它会返回NullPointerException。

我正在使用的库是OpenCSV。他们更新了4.0v,我不知道是否可以同时打开两个读卡器。或者也许我错过了什么。

以下是代码:

public class Traductor_CSV {

   ///////////////////////////////////////////////////////// VARIABLES /////////////////////////////////////////////////////

private final char SEPARADOR = ';';
private final char COMILLAS = '"';
private String[] nombres;
File CSVCat;
File CSVProd;


////////////////////////////////////////////////////// CONSTRUCTOR & START ///////////////////////////////////////////////////////

Traductor_CSV(String Path1, String Path2) {

    CSVCat = new File(Path1);
    CSVProd = new File(Path2);
}
/**
 *  Estaría bien que recibiese por parámetro también los números de las columnas a comparar. Además, este programa se puede
 *  ampliar con una base de datos para conseguir que se haga solo también el traductor y no el comparador. 
 */

public void start () {
    //Do Stuff  º   
LeerCSV(CSVCat, CSVProd);
}


///////////////////////////////////////////// MÉTODOS ////////////////////////////////////////////////////////////// 

/**
 *  Este método lee los CSV que se le pasan por parámetro. Además, guarda dentro del array de Strings 
 *  "nombres" los nombres de las categorías que van llegando.
 * @param CSVCat
 * @param CSVProd
 */
public void LeerCSV(File CSVCat, File CSVProd){  
    //Creo un objeto de la clase FileReader que me hace falta para los CSVReader

   CSVReader CatReader = null;
   CSVReader ProdReader = null;

   CSVParser CatParser;
   CSVParser ProdParser;

   String ruta = "C:\\Users\\ADMINISTRACION2\\Desktop\\Dropshipping\\Feeds de datos\\BigBuy CSV\\Productos_copia.csv";
   File CSV_copia = new File(ruta);


    //Vamos a intentar abrirlos y operar con ellos 

   try {
        //Se crea una especie de "constructor" para crear los lectores de archivos.
        //para ello, antes se le pasan todos los atributos que queramos


   CatParser =
    new CSVParserBuilder()
    .withSeparator(SEPARADOR)
    .withIgnoreQuotations(true)
    .build();
    CatReader =
    new CSVReaderBuilder(new FileReader(CSVCat))
    .withSkipLines(1)
    .withCSVParser(CatParser)
    .build();

    ProdParser =
    new CSVParserBuilder()
    .withSeparator(SEPARADOR)
    .withIgnoreQuotations(true)
    .build();
    ProdReader =
    new CSVReaderBuilder(new FileReader(CSVProd))
    .withSkipLines(1)
    .withCSVParser(ProdParser)
    .build();


    //Definimos el array de Strings de la línea leída
    String [] lineaCat;

    String [] lineaProd = null;
    int i=0;

        try{
                //Lee las líneas del CSV de PRODUCTOS primero y las pone en lineaProd []
                while ((lineaProd = ProdReader.readNext())!= null){  

                //Creo un array de strings para guardar las categorías separadas por comas
                // después, meto cada una en uno de los huecos del array y los imprimo. Hasta aquí todo ok.
                // 17/08/2017

                String [] categorias_split = null;
                categorias_split = lineaProd[3].split(",");

//                    for (int j=0; j<categorias_split.length; j++){
//                   
//                    System.out.println(categorias_split[j] + " "); }
//                   
//                    System.out.println(lineaProd[3].toString() + "\n");


                 //Lee las líneas del CSV de CATEGORIAS cada vez que se lee una nueva de PRODUCTOS y lo pone en lineaCat[]

                while ((lineaCat = CatReader.readNext())!= null) {

                    //Cada vez que lee una nueva línea, meto el nombre en su sitio

                     nombres [i] = lineaCat[2];
                     i++;
                     System.out.println (lineaCat[1]);
                    //Comparo cada columna con su correspondiente

//                     if(CompararColumnas (categorias_split, lineaCat[0])) {

//                            //Si son iguales, se copia
//                            
//                            
//                            copiarEnArchivo(CSV_copia ,nombres, lineaCat[0]);
//                      }

                }
                //Cierro el lector y creo otro para que me vuelva a entrar en el bucle en cada iteración.
              CatReader.close();
              CatReader =
                new CSVReaderBuilder(new FileReader(CSVCat))
                .withSkipLines(1)
                .withCSVParser(CatParser)
                .build();

             }
            } catch (IOException ex) {
            Logger.getLogger(Traductor_CSV.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (FileNotFoundException ex) {
        Logger.getLogger(Traductor_CSV.class.getName()).log(Level.SEVERE, null, ex); 

    } finally {
    }
        try {
        //En cualquier caso, lo cerramos al final.
            CatReader.close();
            ProdReader.close();
        } catch (IOException ex) {
            Logger.getLogger(Traductor_CSV.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

NullPointerException就是这个:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at traductor_bigb.Traductor_CSV.LeerCSV(Traductor_CSV.java:144)
    at traductor_bigb.Traductor_CSV.start(Traductor_CSV.java:57) 

我希望它有所帮助。谢谢大家。

0 个答案:

没有答案