Foros del Web » Programación para mayores de 30 ;) » Java »

Problemas con un listado en java

Estas en el tema de Problemas con un listado en java en el foro de Java en Foros del Web. Hola a todos! De antemano agradezco a todos aquellos que lean este mensaje y más profundamente aquellos que puedan responder. Mi problema es el siguiente, ...
  #1 (permalink)  
Antiguo 01/03/2008, 22:40
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Problemas con un listado en java

Hola a todos!

De antemano agradezco a todos aquellos que lean este mensaje y más profundamente aquellos que puedan responder.

Mi problema es el siguiente, el programa que coloco en la parte inferior hace un filtrado de archivos en este caso, devuelve todos los archivos que empiezan por "b0", y lo que he intentado sin éxito es que una vez filtrado el listado, por la clase findFIles guardemos el contenido de esos archivos en nuevos, es decir si el programa me muestra los archivos b0123.123, b0456.123, b0789,,,,,, el siguiente pasó sería extraer el contenido de cada uno de ellos y ponerlo en otros archivos por ejemplo el b0123.123 en el MTL0123.dat, el b0456 en MTL0456.el123, el b0789 en MTL0789.dat,,,,,,
Básicamente es poner esta linea en una variable findFiles(list[i], filter, output); para que pueda ser leía por FileInputStream fileInput = new FileInputStream(NOMBRE DE LA VARIABLE);

Realmente estoy desesperado, llevo dias intentando y toda la ayuda que me puedan proporcionar estaré muy, agradecido y espero algún día poder hacer algo por ustdes.

Un saludo

Código:
import java.io.*;

public class dia
{
   public static void findFiles(File file, FileFilter filter, PrintStream output) throws IOException
   {
      //Recoge todos los archivos del directorio que cumplan con la condición en la clase main
      if (file.isDirectory()) 
      {
         File[] list = file.listFiles();
         for (int i = list.length; --i>=0;) 
         {       
            findFiles(list[i], filter, output);
         }         
               
      } 
      else 
      {
         if (filter.accept(file))
         {  
            output.println(file);
            try
            {  
               // Se abre el fichero original para lectura
               FileInputStream fileInput = new FileInputStream(file.toString());
               BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
                
               String str = fileInput.getName();
               // Se abre el fichero donde se hará la copia
               FileOutputStream fileOutput = new FileOutputStream ("MTL" + str.substring(5,10) + ".DAT");
               BufferedOutputStream bufferedOutput = new BufferedOutputStream(fileOutput);
               
               // Bucle para leer de un fichero y escribir en el otro.
               byte [] array = new byte[10000];
               int leidos = bufferedInput.read(array);
               while (leidos > 0)
               {
                  bufferedOutput.write(array,0,leidos);
                  leidos=bufferedInput.read(array);
               }
                      
               // Cierre de los archivo
               bufferedInput.close();
               bufferedOutput.close();
            }
            catch (Exception e)
            {
               e.printStackTrace();
	    }
         }
         
      }
   }
    
   public static void main(String[] args) 
   {

      class NameFilter implements FileFilter 
      {
         private String mask;
         NameFilter(String mask) 
         {
            this.mask = mask;
         }
         
         public boolean accept(File file)
         {
         
            return (file.getName().indexOf(mask)!=-1)?true:false;
         }
      }
      
      File pathFile = new File(".");

      String filterString = "b0";
      
      //Hacemos un contador de tiempo que repite la función cada 10 segundos
      try 
      {
         while (true) 
         {
            FileFilter filter = new NameFilter(filterString);
            findFiles(pathFile, filter, System.out);

            try 
            {
              Thread.sleep(10000);

            }
            catch (InterruptedException e) {}
         }
      } 
      catch(Exception e) 
      {
      e.printStackTrace();
      }   
   }
}
  #2 (permalink)  
Antiguo 02/03/2008, 00:18
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Re: Problemas con un listado en java

Espero que sea de ayuda...

btw... que lea un int a la vez no es problema puesto que de hacer el "buffer" se encarga "Buffered__Stream",

Código:
	public static void copyFile(File source) throws Exception {
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(source.getPath() + ".bak"));

		int i;
		while ((i = in.read()) != -1) {
			out.write(i);
		}
		
		out.close();
		in.close();
	}
Y una aplicación basada en tu código donde hice pruebas...

Código:
package org.ejemplo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Ejemplo extends Thread {

	private boolean running = true;

	public Ejemplo() {
	}

	public void run() {
		String strFilter = "b0";
		String strFile = "/home/hackmanc/";
		
		while (running) {
			nameFilter filter = new nameFilter(strFilter);
			findFiles(new File(strFile), filter);
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				running = false;
			}
		}
	}

	public static void main(String[] args) {
		new Ejemplo().start();
	}

	/**
	 * Recoge todos los archivos del directorio que cumplan con la condición
	 * @param file archivo inicial recursivo
	 * @param filter filtro de nombres de archivo
	 */
	public static void findFiles(File file, FileFilter filter) {
		if (file.isDirectory()) {
			for (File f : file.listFiles(filter)) {
				findFiles(f, filter);
			}
		} else {
			try {
				copyFile(file);
				System.out.println("Copiado exitósamente : " + file.getPath());
			} catch (Exception e) {
				System.out.println("Error en copia : " + file.getPath());
			}
		}
	}

	public static void copyFile(File source) throws Exception {
		String strNewName = String.format("%1s/MTL%2$s.DAT",
				source.getParent(), source.getName().substring(5, 10));
		
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(strNewName));

		int i;
		while ((i = in.read()) != -1) {
			out.write(i);
		}

		out.close();
		in.close();
	}

	private class nameFilter implements FileFilter {
		private String mask;

		nameFilter(String mask) {
			this.mask = mask;
		}

		public boolean accept(File file) {
			return file.getName().startsWith(mask);
		}
	}
}
Saludos,

Última edición por HackmanC; 02/03/2008 a las 01:10 Razón: buffer + edit ....
  #3 (permalink)  
Antiguo 02/03/2008, 17:57
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problemas con un listado en java

Wooow gracias HackmanC por contestar!

Por principio de cuentas quisiera agregar que no utilizó ninguna herramienta grafica para programar como el netbeans o eclipse, lo hago todo con el notepad.

Cuando compilo el código que me enviaste me aparencen un par de errores que he intentado solucionar sin éxito los pongo para ver que me sugieres hacer.

Gracias nuevamente por tu ayuda.

Código:
c:\java>javac Ejemplo.java
Ejemplo.java:41: ';' expected
                        for (File f = file.listFiles(filter)) {
                                                            ^
Ejemplo.java:44: illegal start of expression
                } else {
                ^
2 errors
  #4 (permalink)  
Antiguo 02/03/2008, 22:30
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Re: Problemas con un listado en java

Cita:
Iniciado por oscarmoal Ver Mensaje
Código:
c:\java>javac Ejemplo.java
Ejemplo.java:41: ';' expected
                        for (File f = file.listFiles(filter)) {
                                                            ^
Ejemplo.java:44: illegal start of expression
                } else {
                ^
2 errors
El problema es que cambiaste los ":" por "=".

Código:
for (File f : file.listFiles(filter)) {
	findFiles(f, filter);
} else ...
La versión de Java debe ser mayor de 1.5 para
poder usar esa sintaxis (for each). De otra forma,
igual a lo que ya tenias...

Código:
File[] list = file.listFiles(filter);
for (int i = 0; i < list.length; i++) {
  findFiles(list[i], filter);
} else ...
Saludos,

Última edición por HackmanC; 02/03/2008 a las 22:39 Razón: 1.5
  #5 (permalink)  
Antiguo 02/03/2008, 22:45
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problemas con un listado en java

Tienes toda la razón, solo que hay un problema, requiero usar la versión 1.4.2_16 en este proyecto.

Realmente estoy agradecido por el esfuerzo que has hecho. Supongo que empezaré a resignarme.

Tu crees que haya alguna otra forma de poder realizar esta función?
  #6 (permalink)  
Antiguo 02/03/2008, 23:16
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Re: Problemas con un listado en java

Versión 1.2 :

Código:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Ejemplo extends Thread {

	private boolean running = true;

	public Ejemplo() {
	}

	public void run() {
		String strFilter = "b0";
		String strFile = "/home/hackmanc/Desktop";
		
		while (running) {
			nameFilter filter = new nameFilter(strFilter);
			findFiles(new File(strFile), filter);
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				running = false;
			}
		}
	}

	public static void main(String[] args) {
		new Ejemplo().start();
	}

	/**
	 * Recoge todos los archivos del directorio que cumplan con la condición
	 * @param file archivo inicial recursivo
	 * @param filter filtro de nombres de archivo
	 */
	public static void findFiles(File file, FileFilter filter) {
		if (file.isDirectory()) {
			File[] list = file.listFiles(filter);
			for (int i = 0; i < list.length; i++) {
				findFiles(list[i], filter);
			}
		} else {
			try {
				copyFile(file);
				System.out.println("Copiado exitósamente : " + file.getPath());
			} catch (Exception e) {
				System.out.println("Error en copia : " + file.getPath());
			}
		}
	}

	public static void copyFile(File source) throws Exception {
		String strNewName = source.getParent() + "/MTL" +
			source.getName().substring(5, 10) + ".DAT";
		
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(strNewName));

		int i;
		while ((i = in.read()) != -1) {
			out.write(i);
		}

		out.close();
		in.close();
	}

	private class nameFilter implements FileFilter {
		private String mask;

		nameFilter(String mask) {
			this.mask = mask;
		}

		public boolean accept(File file) {
			return file.getName().startsWith(mask);
		}
	}
}
Ok, con estas modificaciones compila en Sun Java 1.2 y GNU gcj.

Cita:
Tu crees que haya alguna otra forma de poder realizar esta función?
En lo personal siempre trato de postear respuestas directamente
relacionadas con la pregunta, para evitar conflictos, puesto que
si te dijera ... heeeey, por que haces eso ? mejor haz esto otro ! casi
siempre tiene una reacción negativa por ejemplo ... heeey... yo quiero
hacer esto y por eso lo estoy preguntando !

Pero ahora que lo mencionas, creo que no necesitas hacer un
programa para esto, te funcionaría mejor un script de "DOS" en
Windows y agregarlo a "Tareas programadas" o un script de "bash"
en Linux y agregarlo a los script's "Cron". (O utiliza un lenguaje de
programación script, como perl, python, tcl, etc, es mucho más fácil)

Pero eso mi amigo ... es otra historia.

Saludos,

Última edición por HackmanC; 02/03/2008 a las 23:31 Razón: edit
  #7 (permalink)  
Antiguo 03/03/2008, 08:43
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problemas con un listado en java

Que tal!

Creo que eres uno de los mejores programadores que he conocido, y aunque no te conozco en persona te estoy muy agradecido por lo que has hecho.

Si algún día puedo compensarte de alguna forma no dudes en que lo haré.

Se que te he pedido mucho, y quisiera agregar un par de cosas al programa, las cuales son: como podría eliminar los archivos originales después de hacer el copiado exitoso, y lo segundo es que hay que guardar el contenido de los archivos orginales en los nuevos archivos ".dat", con el siguiente formato y con la condición de que no tome la primera línea del archivo original, sino que empiece a partir de la segunda.

Código:
public static String plstbuilder (String str)
	{
		String plstrow = null;
		String plu, depto, precio, tipo, t, cad, desc, walo;
		
		plu = str.substring(12, 16);
		depto = str.substring(17, 20);
		precio = str.substring(33,39);
		t = str.substring(39, 46);
                
		if(t.equals("0000000"))
		{
		   tipo="0";
		}
		else
		{
		   tipo="1";
		}
                
		cad = str.substring(54,55 );
		desc = str.substring(174, 192);
		walo = "0";
		
		plstrow = plu + depto + walo + tipo + cad + desc + precio;
			
		return plstrow;
	}
Podrías indicarme como introducirlo dentro del código que me pasaste.

Gracias Amigo.
  #8 (permalink)  
Antiguo 03/03/2008, 20:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Información Re: Problemas con un listado en java

Mmmm.... ok

Código:
    /**
     * Copia un fichero con un nuevo nombre
     * @param source fichero origen
     * @throws java.lang.Exception si ocurre un error de lectura o escritura
     */
    public static void copyFile(File source) throws Exception {
        String strNewName = source.getParent() + "/MTL" +
                source.getName().substring(5, 10) + ".DAT";

        /**
         * BufferedInputStream/BufferedOutputStream :  para caracteres
         * BufferedReader/BufferedWriter : para strings
         */
        BufferedReader in = new BufferedReader(new FileReader(source));
        BufferedWriter out = new BufferedWriter(new FileWriter(strNewName));

        /**
         * Lee una linea por adelantado y la descarta.
         */
        String s = in.readLine();
        if (s != null) {
            while ((s = in.readLine()) != null) {
                /**
                 * Da formato a la linea leida y la escribe en la salida.
                 */
                out.write(plstbuilder(s));
            }
        }

        out.close();
        in.close();
    }
Una aplicación de ejemplo:

Código:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;

public class Ejemplo extends Thread {

    private boolean running = true;

    public Ejemplo() {
    }

    public void run() {
        String strFilter = "b0";
        String strFile = "/home/hackmanc/Desktop";

        while (running) {
            nameFilter filter = new nameFilter(strFilter);
            findFiles(new File(strFile), filter);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                running = false;
            }
        }
    }

    public static void main(String[] args) {
        new Ejemplo().start();
    }

    /**
     * Recoge todos los archivos del directorio que cumplan con la condición
     * @param file archivo inicial recursivo
     * @param filter filtro de nombres de archivo
     */
    public static void findFiles(File file, FileFilter filter) {
        if (file.isDirectory()) {
            File[] list = file.listFiles(filter);
            for (int i = 0; i < list.length; i++) {
                findFiles(list[i], filter);
            }
        } else {
            try {
                copyFile(file);
                file.delete(); // BORRA EL ARCHIVO O INTENTA BORRARLO
                System.out.println("Copiado exitósamente : " + file.getPath());
            } catch (Exception e) {
                System.out.println("Error en copia : " + file.getPath());
            }
        }
    }

    /**
     * Copia un fichero con un nuevo nombre
     * @param source fichero origen
     * @throws java.lang.Exception si ocurre un error de lectura o escritura
     */
    public static void copyFile(File source) throws Exception {
        String strNewName = source.getParent() + "/MTL" +
                source.getName().substring(5, 10) + ".DAT";

        /**
         * BufferedInputStream/BufferedOutputStream :  para caracteres
         * BufferedReader/BufferedWriter : para strings
         */
        BufferedReader in = new BufferedReader(new FileReader(source));
        BufferedWriter out = new BufferedWriter(new FileWriter(strNewName));

        /**
         * Lee una linea por adelantado y la descarta.
         */
        String s = in.readLine();
        if (s != null) {
            while ((s = in.readLine()) != null) {
                /**
                 * Da formato a la linea leida y la escribe en la salida.
                 */
                out.write(plstbuilder(s));
            }
        }

        out.close();
        in.close();
    }

    /**
     * Da formato a str
     * @param str la cadena a dar formato
     * @return la cadena original con un nuevo formato
     */
    public static String plstbuilder(String str) {
        String plstrow = null;
        String plu, depto, precio, tipo, t, cad, desc, walo;

        plu = str.substring(12, 16);
        depto = str.substring(17, 20);
        precio = str.substring(33, 39);
        t = str.substring(39, 46);

        if (t.equals("0000000")) {
            tipo = "0";
        } else {
            tipo = "1";
        }

        cad = str.substring(54, 55);
        desc = str.substring(174, 192);
        walo = "0";

        plstrow = plu + depto + walo + tipo + cad + desc + precio;

        return plstrow;
    }

    private class nameFilter implements FileFilter {

        private String mask;

        nameFilter(String mask) {
            this.mask = mask;
        }

        public boolean accept(File file) {
            return file.getName().startsWith(mask);
        }
    }
}
Cita:
Por principio de cuentas quisiera agregar que no utilizó ninguna herramienta grafica para programar como el netbeans o eclipse, lo hago todo con el notepad.
Sabias que son gratis ?

Saludos,

Última edición por HackmanC; 03/03/2008 a las 20:57 Razón: delete()
  #9 (permalink)  
Antiguo 03/03/2008, 22:45
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problemas con un listado en java

En verdad no se como lo logras, pero eres el mejor.

Lo que pusiste es justo lo que necesito, y prometo que saliendo de este compromiso, me meteré a estudiar java desesperadamente hasta volverme muy bueno. Quiero pedirte un último favor y prometo que no te molestaré más. Se trata de dos detalles más el primero es que los archivos de los cuales extraemos información tienen la siguiente configuración:

Código PHP:
0012090719420000001920000200041500104000000050100000010000290000000000000029000                    
0000001920000200032900101000000050100000100000035000000000000035000                    
0000001920000200026000101000000050100000100000260000000000000260000                    
0000001920000200081900101000000050100000100000091400000000000091400                    
0000001920000200082000101000000050100000100000056600000000000056600                    
0000001920000200071500101000000050100000100000043500000000000043500                    
0000000000000600000000000000000000000000000000000000000000000000000                    
0000000000000600000000000000000000000000000000000000000000000000000 
Y de acuerdo con lo que has hecho en el programa, lee la cadena de texto a partir de la segunda línea, lo que me gustaría que hiciera la función es que terminando de escribir la segunda línea hiciera un salto de línea y brincará a la tercera, y luego a la cuarta y así sucesivamente hasta acabar, es decir que los acomode de la siguiente forma.

Código PHP:
0200;721;0;1;0;00391;010000;
0200;828;0;1;0;00478;010000;
0200;833;0;1;0;00609;010000;
0200;788;0;1;0;00661;010000;
0200;663;0;1;0;05914;010000;
0600;000;0;0;0;00000;000000;
0600;000;0;0;0;00000;000000;
0200;224;0;1;0;00099;010000
Y finalmente tengo el siguiente problema, hay veces que voy a tener que leer archivos como b0000123.123, otras veces b1234000.123, b4560000.123, en el programa estamos fitrando todos los archivos que empiezan por la cadena "b0", y lo más sencillo sería filtar los archivos que empiecen por la letra "b", pero en ese directorio voy a tener otros archivos que empiezan por la letra b y que no deben ser modificados, hay alguna forma de asigar una variable que vaya del 0 al 9 y que pueda concatenarla con la cadena de filtrado, para que me tome la cadena "b" + algún valor numerico (del 0 al 9)?.

Nuevamente agardeciendo tu tiempo y todo el esfuerzo que has hecho para ayudarme, esto es lo último que te pido, lo prometo, espero que pronto nos podamos ver como dos colaboradores de foros como este y no solo como solicitantes, bueno en realidad ese es mi caso, jaja.

Mi correo es [email protected], se que muy poco podría yo aportar a tu conocimiento, pero el día que necesites algo y pueda yo ayudarte, no dudes en que lo haré.

Mil gracias por todo.

El código al final ha sido.

Código:
import java.io.*;

public class Ejemplo extends Thread {

    private boolean running = true;

    public Ejemplo() {
    }

    public void run() {
        String strFilter = "b0";
        String strFile = "c:/java";

        while (running) {
            nameFilter filter = new nameFilter(strFilter);
            findFiles(new File(strFile), filter);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                running = false;
            }
        }
    }

    public static void main(String[] args) {
        new Ejemplo().start();
    }

    /**
     * Recoge todos los archivos del directorio que cumplan con la condición
     * @param file archivo inicial recursivo
     * @param filter filtro de nombres de archivo
     */
    public static void findFiles(File file, FileFilter filter) {
        if (file.isDirectory()) {
            File[] list = file.listFiles(filter);
            for (int i = 0; i < list.length; i++) {
                findFiles(list[i], filter);
            }
        } else {
            try {
                copyFile(file);
                file.delete(); // BORRA EL ARCHIVO O INTENTA BORRARLO
                System.out.println("Copiado exitósamente : " + file.getPath());
            } catch (Exception e) {
                System.out.println("Error en copia : " + file.getPath());
            }
        }
    }

    /**
     * Copia un fichero con un nuevo nombre
     * @param source fichero origen
     * @throws java.lang.Exception si ocurre un error de lectura o escritura
     */
    public static void copyFile(File source) throws Exception {
         String strNewName = "C:/java/toledo/MTL" + source.getName().substring(3, 8) + ".DAT";

        /**
         * BufferedInputStream/BufferedOutputStream :  para caracteres
         * BufferedReader/BufferedWriter : para strings
         */
        BufferedReader in = new BufferedReader(new FileReader(source));
        BufferedWriter out = new BufferedWriter(new FileWriter(strNewName));

        /**
         * Lee una linea por adelantado y la descarta.
         */
        String s = in.readLine();
        if (s != null) {
            while ((s = in.readLine()) != null) {
                /**
                 * Da formato a la linea leida y la escribe en la salida.
                 */
                out.write(plstbuilder(s));
            }
        }

        out.close();
        in.close();
    }

    /**
     * Da formato a str
     * @param str la cadena a dar formato
     * @return la cadena original con un nuevo formato
     */

    public static String plstbuilder(String str) {
        String plstrow = null;
        String plu, depto, precio, tipo, t, cad, desc, walo;

        plu = str.substring(12, 16);
        depto = str.substring(17, 20);
        precio = str.substring(33, 39);
        t = str.substring(39, 46);

        if (t.equals("0000000")) {
            tipo = "0";
        } else {
            tipo = "1";
        }

        cad = str.substring(54, 55);
        desc = str.substring(60, 65);
        walo = "0";

        plstrow = plu + ";" + depto + ";" + walo + ";" + tipo + ";" + cad + ";" + desc + ";" + precio + ";";

        return plstrow;
    }

    private class nameFilter implements FileFilter {

        private String mask;

        nameFilter(String mask) {
            this.mask = mask;
        }

        public boolean accept(File file) {
            return file.getName().startsWith(mask);
        }
    }
}
  #10 (permalink)  
Antiguo 03/03/2008, 23:42
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Información Re: Problemas con un listado en java

Cita:
Iniciado por oscarmoal Ver Mensaje
Y de acuerdo con lo que has hecho en el programa, lee la cadena de texto a partir de la segunda línea, lo que me gustaría que hiciera la función es que terminando de escribir la segunda línea hiciera un salto de línea y brincará a la tercera, y luego a la cuarta y así sucesivamente hasta acabar, ....
Código:
        String p = System.getProperty("line.separator");
        String s = in.readLine();
        if (s != null) {
            while ((s = in.readLine()) != null) {
                out.write(plstbuilder(s) + p);
            }
        }
Cita:
Iniciado por oscarmoal Ver Mensaje
Y finalmente tengo el siguiente problema, hay veces que voy a tener que leer archivos como b0000123.123, otras veces b1234000.123, b4560000.123, en el programa estamos fitrando todos los archivos que empiezan por la cadena "b0", y lo más sencillo sería filtar los archivos que empiecen por la letra "b", pero en ese directorio voy a tener otros archivos que empiezan por la letra b y que no deben ser modificados, hay alguna forma de asigar una variable que vaya del 0 al 9 y que pueda concatenarla con la cadena de filtrado, para que me tome la cadena "b" + algún valor numerico (del 0 al 9)?.
Código:
        public boolean accept(File file) {
            if (file.getName().length() > 1) {
                return file.getName().startsWith(mask) &&
                        Character.isDigit(file.getName().charAt(1));
            }
            return false;
        }
So, ....

Código:
import java.io.*;

public class Ejemplo extends Thread {

    private boolean running = true;

    public Ejemplo() {
    }

    public void run() {
        String strFilter = "b";
        String strFile = "c:/java";

        while (running) {
            nameFilter filter = new nameFilter(strFilter);
            findFiles(new File(strFile), filter);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                running = false;
            }
        }
    }

    public static void main(String[] args) {
        new Ejemplo().start();
    }

    /**
     * Recoge todos los archivos del directorio que cumplan con la condición
     * @param file archivo inicial recursivo
     * @param filter filtro de nombres de archivo
     */
    public static void findFiles(File file, FileFilter filter) {
        if (file.isDirectory()) {
            File[] list = file.listFiles(filter);
            for (int i = 0; i < list.length; i++) {
                findFiles(list[i], filter);
            }
        } else {
            try {
                copyFile(file);
                file.delete();
                System.out.println("Copiado exitósamente : " + file.getPath());
            } catch (Exception e) {
                System.out.println("Error en copia : " + file.getPath());
            }
        }
    }

    /**
     * Copia un fichero con un nuevo nombre
     * @param source fichero origen
     * @throws java.lang.Exception si ocurre un error de lectura o escritura
     */
    public static void copyFile(File source) throws Exception {
        String strNewName = "C:/java/toledo/MTL" + source.getName().substring(3, 8) + ".DAT";

        BufferedReader in = new BufferedReader(new FileReader(source));
        BufferedWriter out = new BufferedWriter(new FileWriter(strNewName));

        String p = System.getProperty("line.separator");
        String s = in.readLine();
        if (s != null) {
            while ((s = in.readLine()) != null) {
                out.write(plstbuilder(s) + p);
            }
        }

        out.close();
        in.close();
    }

    /**
     * Da formato a str
     * @param str la cadena a dar formato
     * @return la cadena original con un nuevo formato
     */
    public static String plstbuilder(String str) {
        String plstrow = null;
        String plu, depto, precio, tipo, t, cad, desc, walo;

        plu = str.substring(12, 16);
        depto = str.substring(17, 20);
        precio = str.substring(33, 39);
        t = str.substring(39, 46);

        if (t.equals("0000000")) {
            tipo = "0";
        } else {
            tipo = "1";
        }

        cad = str.substring(54, 55);
        desc = str.substring(60, 65);
        walo = "0";

        plstrow = plu + ";" + depto + ";" + walo + ";" + tipo + ";" + cad + ";" + desc + ";" + precio + ";";

        return plstrow;
    }

    private class nameFilter implements FileFilter {

        private String mask;

        nameFilter(String mask) {
            this.mask = mask;
        }

        public boolean accept(File file) {
            if (file.getName().length() > 1) {
                return file.getName().startsWith(mask) &&
                        Character.isDigit(file.getName().charAt(1));
            }
            return false;
        }
    }
}
Saludos,
  #11 (permalink)  
Antiguo 04/03/2008, 13:23
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problemas con un listado en java

No tengo palabras para agardecerte.

Hay cuatro cosas que me gustaría preguntarte, la primera es que quiero volverme bueno en java, y aunque hay un monton de cosas que desconozco me gustaría conocer java a fondo, la pregunta es donde puedo empezar y de allí ir subiendo de nivel.

Lo otro es que bueno este programa que estamos desarrollando es una aplicación que es para la escuela, vamos un trabajo escolar, que debemos montar en un servidor con el SO 4690 de IBM y como java es multiplataforma hemos comprobado de los archivos .jar funcionan sin problemas, el detalle ha sido que no soy muy bueno programando en java es por eso que te he pedido tanta ayuda.

En segundo lugar es que el código que me mandaste funciona perfecto, solo que después de ejecutarlo
Cita:
c:\java>java Ejemplo
Copiado exitosamente : c:\java\b0000128.059
Copiado exitosamente : c:\java\b0000160.059
Copiado exitosamente : c:\java\b0000192.059
Copiado exitosamente : c:\java\b0004416.255
Copiado exitosamente : c:\java\b1000160.059
Copiado exitosamente : c:\java\b1004416.255
Copiado exitosamente : c:\java\b2000128.059
Copiado exitosamente : c:\java\b3000192.059
y aunque dice que los archivos b1004416.255, b2000128.059, b3000192.059, etc.
han sido copiados exitosamente, solo coloca como archivos .dat los que empiezan con "b0" y no se que pasa con los otros archivos que son "b + algo numerico", crees que pudieras ayudarme.

Se que te he pedido mucho y que gran parte de mi calificación te la debo a ti. Solo quiero agregar un par de funcionalidades más al código, resulta que cuando pasamos de los archivos b0000192.059, b0000160.059, etc, no debiamos considerar la primera linea, bueno en realidad si hay que tomarla en cuenta pero hay que eliminar los primeros 12 caracteres para que en vez de tenerla así:
Cita:
00120907194100000016000002000715001010000000501000 00100000043500000000000043500
00000016000002000721001010000000501000001000000391 00000000000039100
00000016000002000828001010000000501000001000000478 00000000000047800
Nos quede así

Cita:
00000016000002000715001010000000501000001000000435 00000000000043500
00000016000002000721001010000000501000001000000391 00000000000039100
00000016000002000828001010000000501000001000000478 00000000000047800
para que leamos y escribamos todas las lineas ya con el mismo formato.

Y una última cosa y esta vez prometo que será lo último, es lo siguiente, por ejemplo ya cuando escribimos los archivos .dat el formato queda de la siguiente forma.

Cita:
072;000200;1;010000;005010000;000000000;
082;000200;8;010000;007010000;000000000;
083;000200;3;010000;000106000;000000000;
078;000200;8;010000;003010000;000000000;
066;000200;3;010000;000851000;000000000;
Me gustaría saber si hay alguna forma de que en la quinta columna se eliminaran los ceros de la izquierda y nos quedara de la siguiente forma:

Cita:
072;000200;1;010000;5010000;000000000;
082;000200;8;010000;7010000;000000000;
083;000200;3;010000;106000;000000000;
078;000200;8;010000;3010000;000000000;
066;000200;3;010000;851000;000000000;
Nuevamente gracias por todo, y si me pudieras ayudar de verdad esto será lo último. Solo volveré a molestarte para agardecerte por todo.

Un abrazo.
  #12 (permalink)  
Antiguo 04/03/2008, 15:06
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Re: Problemas con un listado en java

Hola, hoy amanecí un poco payaso ... espero no te molestes ...

Cita:
Iniciado por oscarmoal Ver Mensaje
No tengo palabras para agardecerte.
Por tus mensajes, parece que si tienes; y muchas, demasiadas creo yo ...

Cita:
Iniciado por oscarmoal Ver Mensaje
Hay cuatro cosas que me gustaría preguntarte, la primera es que quiero volverme bueno en java, y aunque hay un monton de cosas que desconozco me gustaría conocer java a fondo, la pregunta es donde puedo empezar y de allí ir subiendo de nivel.
http://java.sun.com/docs/books/tutorial/index.html
Solo que está en Inglés, si no sabes Inglés, aprende Inglés, lee el tutorial y las partes que no comprendas 4 veces, y después no creo que tengas problema. (A mi me tomo 3 meses de mi tiempo libre, pero el tutorial era más pequeño hace varios años).

Cita:
Iniciado por oscarmoal Ver Mensaje
Lo otro es que bueno este programa que estamos desarrollando es una aplicación que es para la escuela, vamos un trabajo escolar, que debemos montar en un servidor con el SO 4690 de IBM y como java es multiplataforma hemos comprobado de los archivos .jar funcionan sin problemas, el detalle ha sido que no soy muy bueno programando en java es por eso que te he pedido tanta ayuda.
IBM en la escuela ? , ha de ser muy buena escuela.

Cita:
Iniciado por oscarmoal Ver Mensaje
y aunque dice que los archivos b1004416.255, b2000128.059, b3000192.059, etc.
han sido copiados exitosamente, solo coloca como archivos .dat los que empiezan con "b0" y no se que pasa con los otros archivos que son "b + algo numerico", crees que pudieras ayudarme.
Eso estaba corregido ...
Código:
        String strFilter = "b";
        String strFile = "c:/java";
Código:
                return file.getName().startsWith(mask) &&
                        Character.isDigit(file.getName().charAt(1));
Cita:
Iniciado por oscarmoal Ver Mensaje
Se que te he pedido mucho y que gran parte de mi calificación te la debo a ti.
Entonces la nota me la van a dar a mí ?

Cita:
Iniciado por oscarmoal Ver Mensaje
Solo quiero agregar un par de funcionalidades más al código, resulta que cuando pasamos de los archivos b0000192.059, b0000160.059, etc, no debiamos considerar la primera linea, bueno en realidad si hay que tomarla en cuenta pero hay que eliminar los primeros 12 caracteres para que en vez de tenerla así:
Usa la función :
String.substring()
igual a lo que hiciste aquí ..

Código:
        plu = str.substring(12, 16);
        depto = str.substring(17, 20);
        precio = str.substring(33, 39);
        t = str.substring(39, 46);
Cita:
Iniciado por oscarmoal Ver Mensaje
Me gustaría saber si hay alguna forma de que en la quinta columna se eliminaran los ceros de la izquierda y nos quedara de la siguiente forma:
Usa la función :
String.substring() , String.indexOf() y String.lastIndexOf()

Cita:
Iniciado por oscarmoal Ver Mensaje
Nuevamente gracias por todo, y si me pudieras ayudar de verdad esto será lo último. Solo volveré a molestarte para agardecerte por todo.
En serio ? ... Yo pensé que íbamos a hacer otro programa ?

Saludos,

ps: Ok, ok ... para ser sincero ... no es la primera vez y creo que tampoco la ultima en la cual sucede esto, creo que ya perdí la cuenta. Por eso mi estimado amigo inglés dlorde en otro foro me enseño la ley : "I SHALL NOT WRITE AND POST CODE". (Pero nunca le hice caso -ni pienso hacerlo-

Tienes suficiente para solventar tu problema, si necesitas ayuda en otra cosa ... crea un nuevo "Tema", puesto que esto está mas que resulto, por mi parte fue un gusto ayudarte en esta aplicación.

Última edición por HackmanC; 04/03/2008 a las 15:19
  #13 (permalink)  
Antiguo 04/03/2008, 15:57
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problemas con un listado en java

Creo que he aprendido mucho más de lo que esperaba.

De verdad HackmanC solo me resta agradecerte, por todo, espero nos podamos encontrar pronto.

Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:27.