Foro de elhacker.net

Programación => Java => Mensaje iniciado por: rommel89 en 28 Junio 2012, 09:58 am



Título: Escritura con archivos JAVA
Publicado por: rommel89 en 28 Junio 2012, 09:58 am
La siguiente duda es la siguiente

El programa trata de que dado un archivo con (n) lineas debe de ser leido y escrito en otro archivo acomodandolo de menor a mayor.

Tengo un archivo con extension h (extension de c o c++) este archivo contiene 131 lineas y su contenido esta dividido en 4 columnas.
El cual contiene numero y letras.

myArchivo.h
 01254152634152   2312    085465200012   FDDG4152
 05432105454321   15513  084527203321   NBN1321N
 46543131215465   12        094552254515   GFDG121F
 46546532154514    01       184543254855   DFG223D2
 .
 .
 .
 .
 asi hasta 131 lineas
ETC.

El contenido de este archivo esta desordenado y para ordenarlo se toma encuenta la 3 columna ya que si se fijan el 7 carcter siempre es un 2 y la tercer columna empieza desde la columna 25 contando los espacios enblanco (entodas las filas) y desde la columna 25 hasta la columna 31 de la misma fila se obtiene un numero.
Por ejemplo de la linea 1 obtenemos el numero (columna 25)084526(columna 31)
y nos sobran estos caracteres 200012 (este numero no importa) y asi es con la fila 2 085465 y la fila 3  094552 y asi hasta la 131.
y con esos numero se puede saber que linea es mas menor a aquien. Este pedazo ya lo tengo

aqui codigo lo pondre con la etiqueta de py porq no hay para java

Código
  1. import java.io.BufferedReader;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.lang.reflect.Array;
  8. import java.util.Arrays;
  9. import java.util.Collections;
  10. import java.util.HashMap;
  11. import java.util.Iterator;
  12. import java.util.Map;
  13. import java.util.StringTokenizer;
  14. import java.util.TreeMap;
  15.  
  16. import org.omg.CORBA.TRANSACTION_REQUIRED;
  17.  
  18. public class ordenarConSort {
  19. public static void main(String[] args) {
  20.  
  21. String ArchivoAnomalias = "C:/refo/Anomalias.D"; // se le asigna el nombre al archivo
  22. String ArchivoRefoleo = "C:/refo/Refoleo.D";
  23.  
  24. FileWriter fw1 = null; // la extension al archivo
  25. FileWriter fw3 = null; // la extension al archivo
  26. BufferedReader leer = null;
  27. BufferedReader leer2 = null;
  28.  
  29. try {
  30.  
  31. FileReader entrada = null;
  32. FileReader entrada2 = null;
  33.  
  34. entrada = new FileReader("C:/refo/1333206.D"); //Obtenemos el archivo a leer
  35. int c;
  36. int columna = 1;
  37. int renglon = 1;
  38. int indice = 0;
  39.  
  40. int arreglo[] = new int[131]; arreglo donde aguardaremos los 131 numero ya que es un numero por fila del archivo
  41. String numero = ""; //Aqui se guardara caracter por caracter hasta formar el numero que se ocupa
  42.  
  43. while ((c = entrada.read()) != -1) { //Para saber si no se ha llegado a fin del archivo
  44.  
  45. if (((char) c) == 10) { //Para saber si no se a llegado hasta el final del renglon (salto de linea) que se esta leyendo del archivo
  46. renglon++;
  47. columna = 1;
  48. }
  49.  
  50. if (renglon >= 2 && renglon <= 130) {//PAra empezar desde el renglon numero dos del archivo a leer
  51. if (columna > 123 && columna < 131) {//PAra saber si ya se posiciono en la columna 123 del primer renglon
  52. numero += String.valueOf((char) c);//Se guarda el primer caracter y se le concatena el siguiente caracter mientras se cumpla la condicion
  53. }
  54.  
  55. columna += 1;
  56.  
  57. if (columna == 131) {  //Para saber si ya se leyeron los primeros 8 carcteres de nuestro renglon
  58. arreglo[indice] = Integer.valueOf(numero); //Se convierte el la variable numero a un entero para guardarlo en un arreglo de tipo entero
  59. numero = "";//limpiamos la variable numero para que cuando vuelva a concatenar los
  60.                                                                     caracteres no tenga guardado el numero de la concatenacion anterior
  61. indice++;
  62. }
  63. }
  64. }
  65. entrada.close();//Se cierra el archivo de lectura
  66.  

una vez que ya tengo todo el arreglo lleno con los numero que necesito para saber que renglon es mas chio que quien.
Ahora paso a ordenar los numero de mi arreglo del menor a mayor con el metodo de sort y para eso utilizo la siguiente funcion

Arrays.sort(arreglo); //y con esto estan ordenados mis numeros del menor al mayor (este metodo es de java Arrays.sort())

Despues paso a leer el archivo nuevamente pero ahora obtengo todo el renglon y lo guardo
en un arreglo

Código
  1. String pala[]=new String [131];//Arreglo para guardar la linea completa del arhivo a leer
  2. int i = 0; //contador inicializado
  3. String line = "";//Se guardara la linea leida momentaneamente
  4.  
  5. BufferedReader br = new BufferedReader(new FileReader("C:/refo/1333206.D"));//Archivo a leer
  6.  while ((line = br.readLine()) != null) // lee la linea (br.readLine) y pasalo a la variable linea luego pregunta Mientras no se llegue a fin de archivo
  7. {
  8. pala[i]=line;//guardamos la linea obtenido dentro de nuestro arreglo a utilizar
  9. i++;//incrementa contador
  10. }
  11. br.close();
  12.  
  13.  

Una vez que ya tengo gurdadas todas las lineas de mi arhcivo en my arreglo ahora paso a crear el nuevo archivo y he ir guardando las lineas del menor a mayor
Código
  1.         int cont=0;              
  2. FileWriter fw2 = new FileWriter( "C:/refo/Lecturas.D"); //Archivo a crear
  3. PrintWriter salArch = new PrintWriter(fw2); //Archivo al cual se le va escribir
  4.  
  5. //Se hara un for anidado, el pimer FOR para recorrer el arreglo en donde tenemos los numeros ya acomodados del menor al mayor
  6. //y el segundo FOR para ir buscando el reglon que cumpla con el patron del numero
  7.  
  8. for(i=1; i<arreglo.length; ++i)//Primer for para recorrer el arreglo de los numero ordenados
  9. {
  10. for(int index=0; index<arreglo.length; ++index)//Segundo for para recorrer el arreglo donde se guardo todo el renglon completo
  11. {
  12.                                        //Pregunto que si en el primer renglon que se encuentra guardado dentro de mi arreglo pala. En ese renglon en el que estoy ahorita
  13.                                        //hay una coincidencia con el numero que se esta guardado dentro del arreglo si no existe ese patron la funcion indexOf regresa un -1
  14.                                        //ejemplo en mi renglo pala recordemos que tengo todas las lineas del archivo y en mi arreglo tengo todos los numeros ordenados
  15.                                       // del menor al mayor:
  16.                                       //pala
  17.                                       //pos 0 -  01254152634152   2312    085465200012   FDDG4152
  18.                                       //pos 1 -  05432105454321   15513  084527203321   NBN1321N
  19.                                       //pos 2 -  46543131215465   12        094552254515   GFDG121F
  20.                                       //pos 3 -  46546532154514    01       184543254855   DFG223D2
  21.                                       //pos 4 - .
  22.                                       //pos 5 - .
  23.                                       //pos 6 - .
  24.                                        asi hasta 131 lineas
  25.  
  26.                                        // y en mi arreglo los numero obtenidos anteriormente
  27.                                       //pos 0 -  084527
  28.                                       //pos 1 -  085465
  29.                                       //pos 2 -  094552
  30.                                       //pos 3 -  184543
  31.                                       //pos 4 - .
  32.                                       //pos 5 - .
  33.                                       //pos 6 - .
  34.                                                                     //esta es la posicion 0                                                                                                     //posicion 0
  35.                                      //if(pala[01254152634152   2312    085465200012   FDDG4152] hay una coincidencia con este numero arreglo[084527] )
  36.                                      //si no la hubo busca en el siguiente reglon (si no es diferente de -1)
  37.  
  38.                                       //                                //esta es la posicion 1                                                                                                     //posicion 0
  39.                                      //if(pala[05432105454321   15513  084527203321   NBN1321N] hay una coincidencia con este numero arreglo[084527] )
  40.                                      //En este caso si hubo una coincidencia y se cumple la condicion porque no se regresa -1 sino 0 y por lo tanto este es el renglon mas chico
  41.                                      //de todos y terminamos con este FOR para aumentar la posicion en el arreglo y se vuelve otra vez arrecorrer el arreglo pala para buscar la
  42.                                      //proxima coincidencia
  43. if(pala[index].indexOf(String.valueOf(arreglo[i])) != -1)
  44. {
  45. //Se guarda exactamente el renglon que si cumplio con la condicion
  46.  
  47. salArch.println(pala[index]);
  48. //System.out.println(pala[index]);
  49. cont++;
  50. break;
  51. }
  52. }
  53. }
  54. System.out.println(i+" cont: "+cont);//PAra saber cuantas veces se cumplio la condicion (cont) y la i para saber corraborar que si se dio las 131 bueltas
  55. } //MAnejo de cualquier tipo de excepcion
  56.                catch (FileNotFoundException e) {
  57. e.printStackTrace();
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61.  


bueno el error esta en que cuando lo mando a imprimir en el archivo que yo creo no guarda todas las lineas sino 105 lineas y ya comprobe en consola
de que si se emprimen las 131 lineas pero en el archivo no y no entiendo porq alguien me podria decir en donde esta my error porq por mas que lo busco no
lo encuentro de ehco ahi se ve que hago una impresion a consola y en consola si salen todas las lineas (131 )y ordenadas del menor a mayor
pero como lo escribi antes en el archivo si se guardan las lineas del menor al mayor pero no las 131 lineas y ya revise que si se entra en la condicion 131 veces y si
entra ese numero de veces. No se si sea si despues de un rato el archivo se cierra solo autmaticamente o que es lo q pasa q solo pòne 105 lineas y no las
131 lineas que deben de ser.

PDT: NO acostumbro a documentar asi mi codigo solo lo hice para que se obtuviera una mejor comprencion de que es lo q estoy haciendo
y asi no haya con fuciones bueno eso espero jajajaja.


espero y puedan ayudarme ya que solo me falta resolver ese problemaa


Título: Re: Escritura con archivos JAVA
Publicado por: rommel89 en 19 Julio 2012, 07:05 am
 :D ya lo resolviii