filtrar un TXT

Iniciado por rpk666, 14 Marzo 2011, 14:11 PM

0 Miembros y 1 Visitante están viendo este tema.

rpk666

Hola, estoy haciendo un programa para procesar unos logs de los proxy que tengo.

lo que necesito ahora es saber como acomodar el log, para que quede mas prolijo y luego poder cargarlo en una tabla en el SQL.

este es el codigo que tengo para leer el log, pero no se como filtrarlo.

public class Main {
   
   
   public static void main(String[] args) throws IOException {
   
      File f = new File("c:/users/c319529/workspace/01032010.txt");
       BufferedReader entrada = new BufferedReader( new FileReader( f ) );
       if ( f.exists() )
         
          while ( entrada.readLine() != null){
             
             if (entrada.readLine().matches("DENIED"))
             {
                
             }else {
                System.out.println(entrada.readLine());
             }
             
          }
}
}


este codigo, me muetra por consola todo el archivo y yo necesito que las lineas que contengan TCP_DENIED las borre o no las muestre.

se le ocurre a alguien como hacerlo?

desde ya Muchas gracias!

Valkyr

Quizás con la clase Matcher y Pattern de java.util.Regex, en caso de que sepas usar expresiones regulares, te podría ir mejor. Haces un pattern con la expresión regular, lo compilas con el método de la clase compile() creo recordar que era, luego creas un Matcher y haces match con el texto del fichero, las lineas que encuentre las puedes sustituir por la cadena vacía o por algún otro texto...en fin hay muchos métodos echales un ojo Paquete Regex Java.

Espero haberte servido de ayuda. Saludos.

Debci

Sin duda, como ya han dicho la forma mas fácil y correcta de hacerlo es con regex:

http://www.programacion.com/articulo/expresiones_regulares_en_java_127

Está bastante ameno y fácil de comprender.

Un saludo

rpk666

señores agradezco su ayuda les dejo el codigo como quedo...

al final no use regular expresion, use una funcion que es "contains" que es de Strings.

   public void leerEInsertarEnSQL() {
      StringBuilder text = new StringBuilder();
      try {
         Scanner scanner = new Scanner(new File("/var/log/squid/access.log.0"));
         while (scanner.hasNextLine()) {
            String cadena = scanner.nextLine();
//            System.out.println(cadena);
            if(!cadena.contains("DENIED")){
            String[] campos = obtenerCampos(cadena);
//            System.out.println(campos[0]+" "+campos[2]+" "+campos[3].substring(1)+" "+campos[6]+" "+campos[9]+" "+campos[10]);
//            System.out.println(cadena);
            insertarBase(campos);
            }
         }
         scanner.close();

      } catch (Exception ex) {
         ex.toString();
      }
   }
   
   private void insertarBase(String[] campos) {
      Sql.getInstance().realizarInsert(campos);
   }

   public String[] obtenerCampos(String cadena) {
      return cadena.split("\\s");
   }
}


cualquier consulta que pueda responder, pregunten.

Saludos!

xopito

No me he enterado bien de la estructura del fichero, pero si son varias palabras en la misma linea...¿no sería mejor hacerlo por Tokens?

por ejemplo:
nombreFichero = config.getNombreFichero();
        try {
            lectorFichero = new FileReader(nombreFichero);
        } catch (FileNotFoundException ex) {
            System.out.println("El fichero " + nombreFichero + " no ha sido encontrado");
            //Logger.getLogger(leer.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }
        BufferedReader entrada;
        entrada = new BufferedReader(lectorFichero);
        //FileReader lector = new FileReader(config.getNombreFichero());
        //BufferedReader entrada = new BufferedReader(lector);
        String aux;
        String cadena;
        try {
            while ((aux = entrada.readLine()) != null) {
                if (aux.length() == 0) {
                    System.out.println("La linea esta vacia");
                } else if (aux.charAt(0) == '#') {
                    System.out.println("Es un comentario: " + aux);
                } else if (aux.charAt(0) == '@') {
                    System.out.println("Leida una linea del fichero");
                    aux = aux.substring(1);
                    aux = aux.toUpperCase();
                    tok1 = new StringTokenizer(aux);
                    cadena = tok1.nextToken();
                    if (cadena.equals("USARPIN")) {
                        nuevousarpin = tok1.nextToken();
...etc