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
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Array; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import org.omg.CORBA.TRANSACTION_REQUIRED; public class ordenarConSort { public static void main(String[] args) { String ArchivoAnomalias = "C:/refo/Anomalias.D"; // se le asigna el nombre al archivo String ArchivoRefoleo = "C:/refo/Refoleo.D"; FileWriter fw1 = null; // la extension al archivo FileWriter fw3 = null; // la extension al archivo BufferedReader leer = null; BufferedReader leer2 = null; try { FileReader entrada = null; FileReader entrada2 = null; entrada = new FileReader("C:/refo/1333206.D"); //Obtenemos el archivo a leer int c; int columna = 1; int renglon = 1; int indice = 0; int arreglo[] = new int[131]; arreglo donde aguardaremos los 131 numero ya que es un numero por fila del archivo String numero = ""; //Aqui se guardara caracter por caracter hasta formar el numero que se ocupa while ((c = entrada.read()) != -1) { //Para saber si no se ha llegado a fin del archivo 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 renglon++; columna = 1; } if (renglon >= 2 && renglon <= 130) {//PAra empezar desde el renglon numero dos del archivo a leer if (columna > 123 && columna < 131) {//PAra saber si ya se posiciono en la columna 123 del primer renglon numero += String.valueOf((char) c);//Se guarda el primer caracter y se le concatena el siguiente caracter mientras se cumpla la condicion } columna += 1; if (columna == 131) { //Para saber si ya se leyeron los primeros 8 carcteres de nuestro renglon arreglo[indice] = Integer.valueOf(numero); //Se convierte el la variable numero a un entero para guardarlo en un arreglo de tipo entero numero = "";//limpiamos la variable numero para que cuando vuelva a concatenar los caracteres no tenga guardado el numero de la concatenacion anterior indice++; } } } entrada.close();//Se cierra el archivo de lectura
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
String pala[]=new String [131];//Arreglo para guardar la linea completa del arhivo a leer int i = 0; //contador inicializado String line = "";//Se guardara la linea leida momentaneamente BufferedReader br = new BufferedReader(new FileReader("C:/refo/1333206.D"));//Archivo a leer 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 { pala[i]=line;//guardamos la linea obtenido dentro de nuestro arreglo a utilizar i++;//incrementa contador } br.close();
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
int cont=0; FileWriter fw2 = new FileWriter( "C:/refo/Lecturas.D"); //Archivo a crear PrintWriter salArch = new PrintWriter(fw2); //Archivo al cual se le va escribir //Se hara un for anidado, el pimer FOR para recorrer el arreglo en donde tenemos los numeros ya acomodados del menor al mayor //y el segundo FOR para ir buscando el reglon que cumpla con el patron del numero for(i=1; i<arreglo.length; ++i)//Primer for para recorrer el arreglo de los numero ordenados { for(int index=0; index<arreglo.length; ++index)//Segundo for para recorrer el arreglo donde se guardo todo el renglon completo { //Pregunto que si en el primer renglon que se encuentra guardado dentro de mi arreglo pala. En ese renglon en el que estoy ahorita //hay una coincidencia con el numero que se esta guardado dentro del arreglo si no existe ese patron la funcion indexOf regresa un -1 //ejemplo en mi renglo pala recordemos que tengo todas las lineas del archivo y en mi arreglo tengo todos los numeros ordenados // del menor al mayor: //pala //pos 0 - 01254152634152 2312 085465200012 FDDG4152 //pos 1 - 05432105454321 15513 084527203321 NBN1321N //pos 2 - 46543131215465 12 094552254515 GFDG121F //pos 3 - 46546532154514 01 184543254855 DFG223D2 //pos 4 - . //pos 5 - . //pos 6 - . asi hasta 131 lineas // y en mi arreglo los numero obtenidos anteriormente //pos 0 - 084527 //pos 1 - 085465 //pos 2 - 094552 //pos 3 - 184543 //pos 4 - . //pos 5 - . //pos 6 - . //esta es la posicion 0 //posicion 0 //if(pala[01254152634152 2312 085465200012 FDDG4152] hay una coincidencia con este numero arreglo[084527] ) //si no la hubo busca en el siguiente reglon (si no es diferente de -1) // //esta es la posicion 1 //posicion 0 //if(pala[05432105454321 15513 084527203321 NBN1321N] hay una coincidencia con este numero arreglo[084527] ) //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 //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 //proxima coincidencia if(pala[index].indexOf(String.valueOf(arreglo[i])) != -1) { //Se guarda exactamente el renglon que si cumplio con la condicion salArch.println(pala[index]); //System.out.println(pala[index]); cont++; break; } } } 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 } //MAnejo de cualquier tipo de excepcion catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
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