elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Abrir archivo, leer datos y modificarlos en otro archivo.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Abrir archivo, leer datos y modificarlos en otro archivo.  (Leído 6,659 veces)
Tonyskater

Desconectado Desconectado

Mensajes: 16


El camino al éxito es la actitud.


Ver Perfil
Abrir archivo, leer datos y modificarlos en otro archivo.
« en: 22 Mayo 2017, 12:18 pm »

Hola tengo una duda con un ejercicio que estoy haciendo de LeetSpeak, el enunciado es el siguiente:
a) Dado el siguiente archivo de texto traduce el LeetSpeak a letras.
b)Dado el siguiente archivo de texto traduce el siguiente texto a LeetSpeak

El archivo es una simple cadena de texto cualquiera.

Con la siguiente formula no deberia ser un problema traducirlos:

Lo cual en mi codigo es lo siguiente:
Código
  1. switch (LS) {
  2.                    case 1:
  3.                        while (input.hasNextLine()) {
  4.                            frase = input.nextLine();
  5.                            frase.replace('O', '0').replace('I', '1').replace('Z', '2').replace('E', '3').replace('A', '4')
  6.                                    .replace('S', '5').replace('G', '6').replace('T', '7').replace('B', '8').replace('P', '9');
  7.                            escribir(frase, 1);
  8.                            System.out.println("Se ha formado el LeetSpeak");
  9.                        }   break;
  10.                    case 2:
  11.                        while (input.hasNextLine()) {
  12.                            frase = input.nextLine();
  13.                            frase.replace('0', 'O').replace('1', 'I').replace('2', 'Z').replace('3', 'E').replace('4', 'A')
  14.                                    .replace('5', 'S').replace('6', 'G').replace('7', 'T').replace('8', 'B').replace('9', 'P');
  15.                            escribir(frase, 2);
  16.                            System.out.println("Se ha traducido el LeetSpeak");
  17.                        }   break;
  18.                    default:
  19.                        System.out.println("Introduce un valor valido.");
  20.                        break;
  21.                }
Esto funciona bien, ahora viene cuando explota mi cabeza...
En general este es mi
Código
  1. public class Escribir {
  2.  
  3.    public static void main(String[] args) {
  4.        JFileChooser selector = new JFileChooser();
  5.        selector.showOpenDialog(null);
  6.        selector.setFileSelectionMode(JFileChooser.FILES_ONLY);
  7.        if (selector.getSelectedFile() != null) {
  8.            System.out.println("Has seleccionado el fichero: " + selector.getSelectedFile());
  9.            File archivo = selector.getSelectedFile();
  10.            try {
  11.                FileReader entrada = new FileReader(archivo);
  12.                BufferedReader BR = new BufferedReader(entrada);
  13.                Scanner input = new Scanner(entrada);
  14.                String frase = "";
  15.                while (input.hasNextLine()) {
  16.                    frase = input.nextLine();
  17.                    System.out.println(frase);
  18.                }
  19.                //ESCRIBIR ✔✔
  20.                int LS;
  21.                System.out.println(
  22.                        "¿Quieres un LeetSpeak de este archivo?[1] ");
  23.                System.out.println(
  24.                        "¿Quieres traducir este LeetSpeak?[2] ");
  25.                System.out.print(
  26.                        "Introduce opcion del menu [1|2]: ");
  27.                Scanner menu = new Scanner(System.in);
  28.                LS = menu.nextInt();
  29.                switch (LS) {
  30.                    case 1:
  31.                        while (input.hasNextLine()) {
  32.                            frase = input.nextLine();
  33.                            frase.replace('O', '0').replace('I', '1').replace('Z', '2').replace('E', '3').replace('A', '4')
  34.                                    .replace('S', '5').replace('G', '6').replace('T', '7').replace('B', '8').replace('P', '9');
  35.                            escribir(frase, 1);
  36.                            System.out.println("Se ha formado el LeetSpeak");
  37.                        }   break;
  38.                    case 2:
  39.                        while (input.hasNextLine()) {
  40.                            frase = input.nextLine();
  41.                            frase.replace('0', 'O').replace('1', 'I').replace('2', 'Z').replace('3', 'E').replace('4', 'A')
  42.                                    .replace('5', 'S').replace('6', 'G').replace('7', 'T').replace('8', 'B').replace('9', 'P');
  43.                            escribir(frase, 2);
  44.                            System.out.println("Se ha traducido el LeetSpeak");
  45.                        }   break;
  46.                    default:
  47.                        System.out.println("Introduce un valor valido.");
  48.                        break;
  49.                }
  50.                entrada.close();
  51.            } catch (FileNotFoundException e) {
  52.                System.out.println("Fichero no encontrado");
  53.            } catch (NoSuchElementException e) {
  54.                System.out.println("No es un formato correcto");
  55.                System.out.println("Se esperaba un .txt");
  56.            } catch (Exception e) {
  57.                System.out.println("Se ha producido un error inesperado");
  58.                System.out.println(e.toString());
  59.            }
  60.        } else {
  61.            System.out.println("No se ha seleccionado ningun archivo.");
  62.        }
  63.    }

El tema es que no escribe nada, osea lee el archivo bien, lo muestra y cuando llega el momento eliges la opcion del menu que quieres y no crea el archivo traducido.

Esta es mi funcion escribir:
Código
  1. public static void escribir(String s, int n) {
  2.        if (n == 1) {
  3.            try {
  4.                FileWriter salida = new FileWriter("C:\\Users\\Tony\\Documents\\NetBeansProjects\\AGonzalezJBalmes\\LeetSpeakResultado1.txt", true);
  5.                for (int i = 0; i < s.length(); i++) {
  6.                    salida.write(s.charAt(i));
  7.                }
  8.                salida.close();
  9.            } catch (IOException ex) {
  10.                Logger.getLogger(Escribir.class.getName()).log(Level.SEVERE, null, ex);
  11.            }
  12.        } else if (n == 2) {
  13.            try {
  14.                FileWriter salida = new FileWriter("C:\\Users\\Tony\\Documents\\NetBeansProjects\\AGonzalezJBalmes\\LeetSpeakResultado2.txt", true);
  15.                for (int i = 0; i < s.length(); i++) {
  16.                    salida.write(s.charAt(i));
  17.                }
  18.                salida.close();
  19.            } catch (IOException ex) {
  20.                Logger.getLogger(Escribir.class.getName()).log(Level.SEVERE, null, ex);
  21.            }
  22.        }
  23.    }
Acabo de empezar hace escasos días con ficheros y no me aclaro muy bien...

Gracias de antemano espero que me podáis ayudar.


En línea

Cita de: Manual de mantenimiento de IBM
"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.
Tonyskater

Desconectado Desconectado

Mensajes: 16


El camino al éxito es la actitud.


Ver Perfil
Re: Abrir archivo, leer datos y modificarlos en otro archivo.
« Respuesta #1 en: 22 Mayo 2017, 12:25 pm »

Iba a modificar el post pero pasaban cosas raras con los caracteres prefiero "responderlo"
Este es un ejemplo de Ejecución

No, no crea el archivo, ni salta ningun error, el programa pasa de mi...


En línea

Cita de: Manual de mantenimiento de IBM
"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Abrir archivo, leer datos y modificarlos en otro archivo.
« Respuesta #2 en: 22 Mayo 2017, 16:33 pm »

Normalmente cuando alguien empieza, ni se explica bien, ni pone código (o pone solo 4 líneas), y suele ser un refrito de tripas revueltas. Así que lo primero es felicitarte, porque no caes en ninguna de esas cuestiones.

De entrada, yo te sugeriría que usaras tu alfabeto 1337 tanto en minúsculas como en  mayúsculas. Es decir:
Tal como tienes:
0 1 2 3 4 5 6 7 8 9
o i  z e  a s g t b p

Pero también:
0 1 2 3 4 5 6 7 8 9
O I Z E A S G T B P

de hecho, mucho mejor si todo el texto quedara en mayúsculas, pero bueno... cuando te funcione ya decidirás...

Lo segundo, es señalarte que hacerlo en la forma de 'Replace', en realidad exige recorrer 10 veces el texto, para hacer el cambio. En cada ocasión recorre todo el texto, buscando cada vez una determinada letra que cambiar.
Si el texto es corto (que es lo habitual), no importa, será tan rápido que no se aprecia  ninguna tardanza. Si el texto fuera largo, o lo haces con muchos ficheros podría ser hasta 10 veces más lento de lo que realmente necesita ser.


Para ello, habría que generar un alfabeto, para traducir de uno a otro sistema:
Código:
// Esta función podría llamarse al principio, cuando se crea la clase, que alberga el código (se genera una sola vez, se invoca una sola vez).
Funcion CrearTablasDeTraduccion
    //Primero se hace una equivalencia con el ASCII.
    Bucle K desde 0 a 255
        AlfabetoToLeetSpeak(k) = k
        AlfabetoFromLeetSpeak(k)= k
    Fin bucle

    //Luego se hacen los cambios que proceden (manualmente), yo pongo el cambio para 3 caracteres, tu completa el cambio para los 7 restantes...
    AlfabetoToLeetSpeak(111)=48 ' o =0
    AlfabetoToLeetSpeak(79)=48 ' O = 0

    AlfabetoToLeetSpeak(105)=49 ' i =1
    AlfabetoToLeetSpeak(73)=49 ' I = 1

    AlfabetoToLeetSpeak(122)=50 ' z =2
    AlfabetoToLeetSpeak(90)=50 ' Z = 2
   .... resto de letras asignarles desde 3-9

    // Y la traducción de vuelta, es intercambiar los valores previos, elegimos números por mayúsculas, es imposible regresar de números a myúsculas y minúsculas al mismo tiempo, tal como estaban en origen, hay que decantarse y lo hacemos por mayúsculas, porque se parecne más a los números que las minúsculas.
    AlfabetoFromLeetSpeak(48)=79 ' 0 =O

    AlfabetoFromLeetSpeak(49)=73 ' 1 = I

    AlfabetoFromLeetSpeak(50)=90 ' 2 =Z
   .... resto de letras asignarles desde 3-9
Fin funcion
NOTA: que yo solo he puesto la traducción para 3 caracteres, te falta poner las de los otros 7 restantes...


Luego ya se puede usar la tabla (que proceda) en una funcion de traducir.
Código:
// Una enumeración para señalar la dirección de traduccion (podría ser remplazado por un valor buleano, eso al gusto, lo dejo así por más claridad).
Enumeracion TipoDeTraduccion
    TraducirALeetSpeak = 0
    TraducirDeLeetSpeak = 1
Fin enumeracion

Funcion Traducir(Texto tipo String, Alfabeto tipo TipoDeTraduccion) Devuelve String // o un array de bytes, según se precise.
     ArrayTexto() tipo Array
     ArrayTexto= Convertir(Texto a bytearray)

     Si Alfabeto = TraducirALeetspeak entonces
         Bucle k desde 0 a ArrayTexto.Longitud
             ArrayTexto(k)= AlfabetoToLeetSpeak(ArrayTexto(k))
         fin bucle
     si no // Tradicr desde LeetSpeak
          Bucle k desde 0 a ArrayTexto.Longitud
             ArrayTexto(k)= AlfabetoFromLeetSpeak(ArrayTexto(k))
         fin bucle
      fin si
      Devolver Convertir(ArrayTexto a String) //no es absolutamente necesario La conversión) si se va a guardar a fichero, al fichero se escriben bytes, poco le importa que tu lo consideres string, char o bytes...
fin funcion

-----------------------

Y ahora mirando tú código... qué falla?.

Bueno falla que tu lees una línea de código, la conviertes y nada más convertirla la escribes a UN NUEVO FICHERO Cada VEZ.
Lo que debes hacer primero es crear el fichero de salida, y luego simplemente es mandar escribir al final del fichero, es decir la acción es APPEND (añadir al final), tu sobrescribes el mismo fichero con cada línea que lees y traduces del origen, y lo cierras con cada vez.
Cuando escribas todas las líneas, (es decir al final del bucle de lectura), es cuando debes cerrar el fichero de escritura.

Por tanto tus pasos (simplificados), serían:
Código:
Funcion Traducir(FicheroOrigen, otrosparametros...)
    Si ficheroOrigen no esta vacío ni presenta otros problemas.
        Abrir fichero de escritura: FileWrite
        Abrir fichero de lectura: FileRead
        Por cada Linea en FileRead: LeerLinea
             LineaWrite = Traducir(Linea, DireccionTraduccion)
             FileWrite.Append(LineaWrite)
        fin Cada
        Cerrar FileWrite
    si no
       advertir al usuario: "el fichero introducido, tiene tal o cual problema"
    fin si
fin funcion

Como ves el código es bien sencillo y claro... ahora tu traduce de pseudocódigo...
No olvides controlar las posibles excepciones. que yo no ponga (casi) nada al respecto, obedece a que puedas verlo y entenderlo con claridad....

No he mirado nada más en tu código (solo por encima) y tras ver ese fallo, asumo que no tienes más... en cualquier caso, corrige/modifica y ya veremos si tienes más fallos.
« Última modificación: 22 Mayo 2017, 16:51 pm por NEBIRE » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Abrir archivo, leer datos y modificarlos en otro archivo.
« Respuesta #3 en: 22 Mayo 2017, 22:43 pm »

Nota que describo dos funciones traducir... hay sobrecarga...

Una traduce un texto, la otra traduce un fichero (y lo guarda en otro).
Pero si te produce confusión, puedes explicitar un nombre diferente para cada una:
TraducirFichero(...)
TraducirTexto(...)
En línea

Tonyskater

Desconectado Desconectado

Mensajes: 16


El camino al éxito es la actitud.


Ver Perfil
Re: Abrir archivo, leer datos y modificarlos en otro archivo.
« Respuesta #4 en: 23 Mayo 2017, 12:37 pm »

Nota que describo dos funciones traducir... hay sobrecarga...

Una traduce un texto, la otra traduce un fichero (y lo guarda en otro).
Pero si te produce confusión, puedes explicitar un nombre diferente para cada una:
TraducirFichero(...)
TraducirTexto(...)


Hola, gracias por responder, lo leí anoche pero no podía contestar.
En principio entiendo lo que me dices y creo que es una buena forma de hacerlo, gracias.
Pero ahora mismo no me preocupa la "fluidez" con que haga la operación ya que es un ejercicio simple de clase y no creo que mi profesor se vaya a poner a traducir libros de texto con mi programa.. O sí, pero no se lo recomiendo... :silbar:

He reducido el problema general a una duda simple, mi cerebro no procesa donde tengo que realizar las operaciones...

Tengo un ejemplo sencillo aislado:

Código
  1. public static void main(String[] args) {
  2.        JFileChooser selector = new JFileChooser();
  3.        selector.showOpenDialog(null);
  4.        selector.setFileSelectionMode(JFileChooser.FILES_ONLY);
  5.        if (selector.getSelectedFile() != null) {
  6.            File fichero = selector.getSelectedFile();
  7.            try {
  8.                FileWriter salida = new FileWriter("C:\\Users\\Tony\\Documents\\NetBeansProjects\\AGonzalezJBalmes\\LeetSpeakResultado.txt");
  9.                BufferedWriter bw = new BufferedWriter(salida);
  10.                Scanner entrada = new Scanner(fichero);
  11.                String linea = "";
  12.                //Vamos a leer lo que contiene el fichero que hemos abierto...
  13.                while (entrada.hasNextLine()) {
  14.                    linea = entrada.nextLine();
  15.                    System.out.println(linea);
  16. //                    Mi teoria es que aqui van las operaciones, pero... Con que tengo que operar?
  17. //                    quiero leer el fichero... Lo leo Linea a linea...
  18. //                    y quiero procesar cada linea y escribirla en otro fichero traducida...
  19. //                    hago esto:(Se que esta mal... pero es lo que no entiendo)
  20.                    bw.write(linea.replace('O', '0').replace('I', '1').replace('Z', '2').replace('E', '3').replace('A', '4').replace('S', '5')
  21.                            .replace('G', '6').replace('T', '7').replace('B', '8').replace('P', '9'));
  22.                }
  23.  
  24.                entrada.close();
  25.                salida.close();
  26.            } catch (FileNotFoundException e) {
  27.                System.out.println("Fichero no encontrado");
  28.            } catch (NoSuchElementException e) {
  29.                System.out.println("No es un formato correcto de archivo");
  30.                System.out.println("Es esperaba un fichero de texto.");
  31.            } catch (Exception e) {
  32.                System.out.println("Se ha producido un error inseperado");
  33.                System.out.println(e.toString());
  34.            }
  35.        } else {
  36.            System.out.println("No se ha encontrado ningun archivo");
  37.        }
  38.    }

En los comentarios he situado las dudas...
Gracias de nuevo!
En línea

Cita de: Manual de mantenimiento de IBM
"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Abrir archivo, leer datos y modificarlos en otro archivo.
« Respuesta #5 en: 24 Mayo 2017, 03:41 am »

No se rompe el ordenador por 'probarlo'...

Si, ese es el sitio exacto donde va.

Yo solo añadiría tras el "write", otro System.out.println(linea); así ves como era la línea a la entrada y tras la conversión... y ahí si observas error, corrige según veas que error arroja... después de todo, siempre cuando se está emepezando es buena práctiva añadir líneas de código extra a modo de debug, para ir probando no solo errores, si no incluso ideas nuevas...

p.d.: de haber sabido antes que era un ejercicio de clase, te lo hubiera dejado para que pensaras un poco más... pero creo sinceramente que lo hubieras hecho, en general la gente es perezosa y no se lo toma demasiado en serio, parece que tú sí...
« Última modificación: 24 Mayo 2017, 03:43 am por NEBIRE » En línea

Tonyskater

Desconectado Desconectado

Mensajes: 16


El camino al éxito es la actitud.


Ver Perfil
Re: Abrir archivo, leer datos y modificarlos en otro archivo.
« Respuesta #6 en: 24 Mayo 2017, 20:25 pm »

No se rompe el ordenador por 'probarlo'...

Si, ese es el sitio exacto donde va.

Yo solo añadiría tras el "write", otro System.out.println(linea); así ves como era la línea a la entrada y tras la conversión... y ahí si observas error, corrige según veas que error arroja... después de todo, siempre cuando se está emepezando es buena práctiva añadir líneas de código extra a modo de debug, para ir probando no solo errores, si no incluso ideas nuevas...

p.d.: de haber sabido antes que era un ejercicio de clase, te lo hubiera dejado para que pensaras un poco más... pero creo sinceramente que lo hubieras hecho, en general la gente es perezosa y no se lo toma demasiado en serio, parece que tú sí...

Bueno cuando te gusta algo, aunque sea una obligación, no te cuesta nada ponerte, o por lo menos es mi caso...
Aunque lo has dicho bien "parece", creo que solo me tomo enserio las cosas que me interesan, programación es una de ellas, luego hay otras que ni intentándolo... Como puede ser Administración de sistemas, no digo que no lo saque, sino que me da igual que sea un 5 que un 10... No me gusta.

Por otro lado. tengo en clase el código final... a ver si mañana lo cojo y os lo subo para q veáis que tal ha ido. Gracias por la ayuda. ;-) ;-)
En línea

Cita de: Manual de mantenimiento de IBM
"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
variable batch para ejecutar un archivo al abrir otro
Scripting
@felipe@ 4 8,084 Último mensaje 2 Agosto 2010, 20:59 pm
por FerJGS
Ayuda - Leer Varios Datos en un Archivo Txt
Programación C/C++
alejandrosevenfold 2 3,204 Último mensaje 20 Septiembre 2012, 22:39 pm
por alejandrosevenfold
abrir, obtener datos , modificarlos , y crar nuevo archivo
PHP
Pirat3net 6 2,902 Último mensaje 13 Mayo 2013, 22:58 pm
por #!drvy
Guardar/Leer datos en un archivo excel
.NET (C#, VB.NET, ASP)
adan-2994 3 4,105 Último mensaje 6 Diciembre 2013, 14:26 pm
por fran800m
Abrir y leer un archivo
Programación C/C++
Cas980 1 2,570 Último mensaje 23 Febrero 2014, 16:48 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines