Java - Comparar ficheros linea por linea contra linea por linea de otro fichero

 
Vista:

Comparar ficheros linea por linea contra linea por linea de otro fichero

Publicado por David Guzmán (3 intervenciones) el 21/12/2015 22:36:18
Hola, espero me puedan ayudar. Intentaré explicar lo mejor posible lo que quiero hacer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package ceco;
 
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.StringTokenizer;
 
/**
 * /**
 *
 * @author agarciaa
 */
public class Ceco {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
 
 
 
        String sDirectorio = "/Users/agarciaa/Desktop/carpeta";//ruta de la carpeta 
        File r = new File(sDirectorio);
        File[] ficheros = r.listFiles();
        File pvf = new File ("/Users/agarciaa/Downloads/archivo2.txt"); //ruta del archivo
        BufferedReader qr = null;
        FileReader rr = null;
        BufferedReader dd = null;
        FileReader cc = null;
        BufferedReader ss = null;
        File f = null;
            for (int x = 1; x < ficheros.length; x++) { //se hace el recorrido del directorio archivo por archivo
            String str = (ficheros[x].getPath());
 
            try {
                f = new File(str);
                rr = new FileReader(f);
                dd = new BufferedReader(rr);
                cc = new FileReader(pvf);
                ss = new BufferedReader(cc);
                String linea, linea2;
                String[] numc;
                int i=0;
 
                while ((linea = dd.readLine()) != null) { //HACEMOS LA LECTURA DEL PRIMER ARCHIVO LINEA POR LINEA           
                numc = linea.split("\t"); //ESTE ES EL CAMPO DE LA LINEA A COMPARAR                                      
                while((linea2 = dd.readLine()) != null){   //Aquí hacemos la lectura del segundo archivo linea por linea
                     if(numc[18].equals(linea2)) //SE HACE LA COMPARACIÓN DEL CAMPO CON LA LINEA
                    System.out.println(linea);
 
                }
}
            } catch (Exception e) {
            } finally {
 
                    }
 
            }
            }
    }

Bueno, lo que pasa es que tengo una carpeta con varios archivos .txt y cada uno tiene varias lineas y por otro lado una lista con cadenas de 10 caracteres. Quiero comparar un campo específico de cada linea de cada archivo en la carpeta, con la lista y en caso de que haya una coincidencia, que se imprima la linea del archivo de la carpeta en la que se está. El problema es que cuando corro el programa, solo toma la primer linea de los archivos de la carpeta y se sigue al siguiente archivo, a mi me gustaría que leyera todo el archivo, no solo la primer linea, espero me puedan ayudar.
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Comparar ficheros linea por linea contra linea por linea de otro fichero

Publicado por Marcelo (47 intervenciones) el 22/12/2015 12:51:20
David, como estas?

Primero, como no se de antemano que hay en los archivos, tendré que suponer pero.... La linea2 la estas cargando con el mismo archivo que la linea 1 (osea con los archivos de la carpeta) por ende tu lógica compara ese campo especifico de la linea 1 con el resto de las lineas del mismo archivo.

Segundo, como tu quieres comparar todas las lineas del segundo archivo (archivo con la lista) tienes que cargar el contenido de dicho archivo en un array(o tu estructura favorita) para luego realizar la comparación deseada (recuerda que por cada archivo de la carpeta quieres comparar todo el contenido del archivo lista, por ende, por cada archivo de la carpeta tendrás que volver a leer el archivo lista.... bastante ineficiente si lo tienes que leer del disco cada vez).

Te mando un abrazo y a las ordenes por cualquier duda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Comparar ficheros linea por linea contra linea por linea de otro fichero

Publicado por David Guzmán (3 intervenciones) el 23/12/2015 18:53:17
Wooow, muchísimas gracias. Me sirvió muchísimo tu comentario del array. No se me había ocurrido y funciono a la perfección :D Aunque hice un ArrayList porque esto lo ejecutaré varias veces con listas de diferentes tamaños. Te pongo como quedó el código, en una de esa me puedes decir una mejora que te agradeceré mucho
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package ceco;
 
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
 
/**
 * /**
 *
 * @author agarciaa
 */
public class Ceco {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
 
        String sDirectorio = "/Users/agarciaa/Desktop/pvas_one"; //RUTA DEL DIRECTORIO DE LOS ARCHIVOS
        File r = new File(sDirectorio);
        File[] ficheros = r.listFiles();
        FileReader rr = null;
        BufferedReader dd = null;
        File f = null;
 
        //LAS SIG 8 LINEAS DE CÓDIGO SON PARA HACER QUE NUESTRA LISTA QUEDE EN UN ARRAY LIST (ARREGLO DE TAMAÑO DINÁMICO)
        BufferedReader in = new BufferedReader(new FileReader("/Users/agarciaa/Desktop/listones.txt"));//RUTA CON LA LISTA 
        String cad;
        List<String> list = new ArrayList<String>();
        while ((cad = in.readLine()) != null) {
            list.add(cad);
        }
        String[] stringArr = list.toArray(new String[0]);
 
 
        //EL "FOR" ES PARA HACER EL RECORRIDO DE LA CARPETA DONDE TENEMOS TODOS NUESTROS ARCHIVOS(IMPORTANTE: DEBEN ESTAR TODOS EN UNA SOLA CARPETA)
        for (int x = 1; x < ficheros.length; x++) {
            String str = (ficheros[x].getPath());
            try {
                f = new File(str);
                rr = new FileReader(f);
                dd = new BufferedReader(rr);
                String lineaPVA; //VARIABLE PARA LEER CADA LÍNEA DEL ARCHIVO
                String[] tmp;
                int i = 0; //CONTADOR
 
                while (i < stringArr.length) { //ABRIMOS UN LOOP DENTRO DEL ARCHIVO EN EL QUE ESTAMOS, HAREMOS UN NÚMERO DE NUESTRA LISTA A LA VEZ                        
                    while ((lineaPVA = dd.readLine()) != null) { //HACEMOS LA LECTURA DEL ARCHIVO LINEA POR LINEA                                                                                                                 
                        tmp = lineaPVA.split("\t");//PARTIMOS NUESTRO ARCHIVO POR TABULACIONES
                        if (stringArr[i].equals(tmp[18])) {//SI EL NÚMERO i DE NUESTRA LISTA ES IGUAL AL NÚMERO DE CLIENTE DE LA LÍNEA DEL ARCHIVO QUE SE LEYÓ
                            System.out.println(lineaPVA);//IMPRIMIREMOS LA LÍNEA DEL ARCHIVO EN LA QUE ESTÁ
                        }
                    }
                    i++;//INCREMENTAMOS NUESTRO CONTADOR EN 1 PARA HACER EL SIGUIENTE NUM DE LA LISTA
                }
            } catch (Exception e) {
            } finally {
 
            }
 
        }
    }
}

Muchísimas gracias, Marcelo!!
Fuiste de gran gran ayuda

PD: Los archivos son más o menos así:
La lista tiene sólo número (aunque a veces son alfanuméricos)
15874A8913
4896370025
etc etc
Y los archivos son algo así
MO ME 12436 MEXICO AV INSURGENTES ETC ETC 4896370025 HJHGDAS
(cada línea es así con info diferente, no es exactamente así pero es una idea, cada espacio es una tabulación y son un poco más largos)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Comparar ficheros linea por linea contra linea por linea de otro fichero

Publicado por Marcelo (47 intervenciones) el 23/12/2015 19:28:15
Me alegra mucho haber sido de ayuda.

Solo me queda una duda sobre el problema... Entendí que por cada linea del archivo en la carpeta, tenes que comprar el campo 18 con cada uno de los códigos del archivo lista... esto era así? porque de serlo vas a tener que intercambiar los While (Para cada linea en el archivo de la carpeta, se recorra todo el array).

Otra cosita que no me queda del todo claro, por que cargas un arrayList y luego lo pasas a un array? si haces list.get(i) obtienes el mismo elemento que si haces stringArr[i]. Y para saber el largo con un list.size() alcanza

Saludos y a las ordenes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparar ficheros linea por linea contra linea por linea de otro fichero

Publicado por David Guzmán (3 intervenciones) el 23/12/2015 20:10:50
Muchas gracias de nuevo Marcelo.
No he hecho aún el list.get(i) pero si modifique un poco los while porque estaba teniendo problemas.
Inicie el while (i < stringArr.length){ antes del for e incremente el contador hasta el final. Eso fue todo y quedó al cien.
Saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar