entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Buscar y Reemplazar palabra en java

Tengo esta parte del codigo, ya tengo la parte donde busca en un archivo txt una palabra pero yo necesito que la reemplace, alguien me puede ayudar, se lo agradeceré mucho.

Dejo mi codigo


import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class PruebaDeBuscarDentroDeUnArchivo {
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        // TODO code application logic here
        @SuppressWarnings("resource")
        java.util.Scanner scanner = new Scanner(System.in);
        try {
            final BufferedReader reader = new BufferedReader(
                new FileReader("C:\\Users\\pc\\Desktop\\proyecto1\\test1.txt")
            );
            ///////////////aqui vamos a probar
            String line = "";   
            while((line = reader.readLine())!= null) {
            String valor2="cambialo";
            String cadenaDondeBuscar = "[K";
            String cadenaDondeBuscar2 = "[0m";

                if (line.contains(cadenaDondeBuscar)) {

                    String prueba = cadenaDondeBuscar.replace(cadenaDondeBuscar, valor2);
                    System.out.println("Se encontro la palabra "+ cadenaDondeBuscar);
                    System.out.println(prueba);
                }

                if (line.contains(cadenaDondeBuscar2)) {

                    String prueba2 = cadenaDondeBuscar2.replace(cadenaDondeBuscar2, valor2);
                    System.out.println("Se encontro la palabra "+ cadenaDondeBuscar2);
                    System.out.println(prueba2);
                }

            }

            reader.close();
        } catch (FileNotFoundException e) {e.printStackTrace();
        } catch (IOException           e) {e.printStackTrace();}
    }
}

Desde ya muchas gracias

1 Respuesta

2votos

magarzon Puntos30650

Hola.

Casi lo tenías, solo te faltó escribir los cambios sobre el fichero.

Curiosamente el otro día hubo una pregunta parecida pero para hacerlo en PHP: https://entredesarrolladores.com/16720/aumentar-el-valor-una-columna-dentro-archivo-csv-usando-php

Aunque en ese caso en la solución utilizada se leía y escribía en el fichero simultáneamente (algo que también se puede hace en Java con la clase RandomAccessFile, pero tienes que tener en cuenta codificación de las cadenas, cadenas reemplazadas que ocupan diferente tamaño en bytes... un rollo), la mejor solución en Java es la que tú has propuesto, y a la que le falta como te decía el remate final.

Este sería un código que funciona (he borrado algunas cosas de tu código y he utilizado nombre en inglés para todas las variables, porque o todo en inglés- preferible-, o todo en español, pero nada de mezclar).
Básicamente lo que se hace es leer todo el fichero, utilizar replaceAll para reemplazar en todo el contenido, y luego volver a escribir el fichero entero.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.FileWriter;

public class PruebaDeBuscarDentroDeUnArchivo {
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        // TODO code application logic here
        @SuppressWarnings("resource")
        java.util.Scanner scanner = new Scanner(System.in);
        try {
            final BufferedReader reader = new BufferedReader(
                new FileReader("C:\\Users\\pc\\Desktop\\proyecto1\\test1.txt")
            );

            String line = "", content = "";   
            while((line = reader.readLine())!= null) {
                content += line + "\r\n";
            }

            reader.close();

            String replacement="cambialo";
            String needle = "[K";

            String newContent = content.replaceAll(needle, replacement);

            FileWriter writer = new FileWriter("test.txt");

            writer.write(newContent);

            writer.close();
        } catch (FileNotFoundException e) {e.printStackTrace();
        } catch (IOException           e) {e.printStackTrace();}
    }
}

0voto

rach comentado

hola muchas gracias por tu ayuda si me funciona, sin embargo solo tomaste una palabra en este codigo y yo necesito que me cambie mas de una, estoy viendo como hacerlo de todos modos te agradezco por ayudarme. en cuanto vea como hacerlo con mas de una palabra regreso

Saludos

1voto

magarzon comentado

Aplica consecutivamente el replaceAll con cada palabra.

Imagina que tienes la lista de reemplazos en un mapa, del tipo buscar => reemplazar, donde la clave del mapa son los términos a buscar, y el valor sería su reemplazo. Luego solo tienes que recorrer el mapa como un array e ir aplicando cada substitución con replaceAll

0voto

rach comentado

disculpa, no eh trabajado con nada de esto que comentas, voy a buscar información y seguir intentando, si tienes algún ejemplo me ayudarías mucho para aclarar mis ideas, mientras sigo buscando y de nuevo gracias por la ayuda

0voto

rach comentado

Map<Integer, String> datos = new HashMap<Integer, String>();
            datos.put(1, "[K");
            datos.put(2, "[0");
            datos.put(3, "tres");

            for (Map.Entry<Integer, String> entry : datos.entrySet()) {
                String replacement="1";
                String needle= entry.getValue();
                //System.out.println(needle);
                String newContent = content.replace(needle, replacement);
                System.out.println(newContent);

            }

no se que estoy haciendo mal que no lo cambia :( pero si recorre el array

0voto

rach comentado

ya vi que pasa lo reemplaza pero como si hiciera duplicado del txt,:S ayuda por favor

0voto

magarzon comentado

No entiendo muy bien cuál es tu problema ahora, pero el código que has pegado no es a lo que me refería. En el mapa, las claves tendrían que ser las palabras a reemplazar, no 1, 2 y 3, y los valores serían por qué otras palabras quieres que se reemplace.

0voto

rach comentado

La verdad voy empezando con java, pero ya pude resolver mi problema, lo dejo por si alguien mas lo ocupa

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.FileWriter;

public class PruebaDeBuscarDentroDeUnArchivo {
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        // TODO code application logic here
        @SuppressWarnings("resource")
        java.util.Scanner scanner = new Scanner(System.in);
        try {
            final BufferedReader reader = new BufferedReader(
                new FileReader("C:\\Users\\pc\\Desktop\\proyecto1\\test1.txt")
            );

            String line = "", content = "";   
            while((line = reader.readLine())!= null) {
                content += line + "\r\n";
            }

            reader.close();

            String replacement="cambialo";
            String needle = "[K";
            String needle2 = "[L";
**
            String newContent = content.replace(needle, 
            replacement).replace(needle2.replacement);**  con esto se soluciono

            FileWriter writer = new FileWriter("test.txt");

            writer.write(newContent);

            writer.close();
        } catch (FileNotFoundException e) {e.printStackTrace();
        } catch (IOException           e) {e.printStackTrace();}
    }
}

muchas gracias por tu ayuda, me fue muy util, mil gracias
Saludos

1voto

magarzon comentado

Cuidado, con replace solo reemplazas la primera ocurrencia de [K o [L, si solo tienes una por fichero, bien, pero si quieres reemplazar todas tienes que usar replaceAll

1voto

rach comentado

ya lo probé muchas gracias y si me funciona así como lo puse y cambia todo

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta