Buscar y reemplazar con Java

A la hora de desarrollar necesitamos de ciertas herramientas que nos faciliten esas tareas tan repetitivas que nos sacan de quicio. En este artículo vamos a crear una sencilla herramienta desarrollada en Java para buscar y reemplazar cadenas de texto en varios archivos, de una sola tacada.

Vamos a organizar este desarrollo en tres bloques.

  • Creación de una copia de seguridad de los archivos: En esta herramienta primero vamos a crear una copia de seguridad de todos los archivos en la subcarpeta "backup".
  • Creación del mapa de buscar y reemplazar: Tenemos que crear un mapa a partir de archivos CSV que contengan las cadenas de texto que vamos a buscar y reemplazar.
  • Utilizar el mapa creado para reemplazar esa cadena en el archivo

Ahora entraremos en los detalles de cada bloque de código

Creación de una copia de seguridad

Supongamos que los archivos que vamos a procesar están en D:FindReplace. Ahora bien, esta será nuestra ruta de la carpeta de origen.

String sourceFolderPath = "D:FindReplace";

La ubicación de copia de seguridad sería D:FindReplacebackup. El CSV se localizará en la misma carpeta y los archivos reemplazados también, es decir, la salida de los ficheros, para que os hagáis una idea, será esta: D:FindReplaceReplacedFiles. Lo podéis ver en el código de más abajo:

String sourceFolderPath = "D:FindReplace";
String destFolderPath = sourceFolderPath + "ReplacedFiles";
String findReplaceCSV = sourceFolderPath + "findReplace.csv";

Ahora vamos a empezar a crear la copia de seguridad. Para crear una copia de seguridad necesitamos iterar sobre cada archivo y copiar dicho archivo en la carpeta D:FindReplacebackup con el mismo nombre y la extensión .bak. A continuación, puedes ver cómo llevarlo a cabo:

System.out.println("*****Backup Intialized******");
if(file.isFile()) { 
     String sourceFilePath = file.getAbsolutePath(); 
     String bakFilePath = sourceFilePath.substring(0,sourceFilePath.lastIndexOf(File.separator)) +
                          "backup" + 
                          file.getName().replace(sourceFilePath.substring(sourceFilePath.lastIndexOf("."), 
                          sourceFilePath.length()), ".bak");   
     File backupFile = new File(bakFilePath);   
     createBackup(file, backupFile);      
  } 
}   
System.out.println("****Backup Completed*****");

El código anterior llama al método createBackup() que en realidad es el que copia todos los ficheros. Este método tiene dos argumentos, uno será el archivo origen y el otro será el archivo destino. Es decir, el archivo que queremos copiar y dónde lo queremos copiar. Más abajo, lo podéis ver con más claridad:

public static void createBackup(File source, File target) throws IOException{
        InputStream in = new FileInputStream(source);
        OutputStream out = new FileOutputStream(target);
       
          byte[] buf = new byte[1024];
          int len;
     
          while ((len = in.read(buf)) > 0) {
              out.write(buf, 0, len);
          }
     
          in.close();
          out.close();
    }

Con esto completamos la primera sección. Ahora vamos a ver cómo crear el mapa para buscar y reemplazar.

Mapa Buscar y Reemplazar

Tenemos que crear una colección de mapas del archivo CSV que contengan las cadenas a buscar y reemplazar. Aquí vamos a almacenar las cadenas encontradas en el CSV mediante una llave en el mapa y la correspondiente cadena de reemplazo se almacenará como valor de la clave. A continuación podemos ver el código en acción:

Map<String, String> findReplaceMap = new HashMap<String, String>();
        
        System.out.println("****Find Replace Map Creation Started****");
        
        findReplaceMap = createReplaceMap(findReplaceCSV);
        
        System.out.println("****Find Replace Map Created!*****");

En el código anterior se llama al método createReplaceMap() que toma como parámetro la cadena de texto. Esta cadena contendrá la ubicación del archivo CSV y este método se ocupará de leer dicho archivo, de crear un mapa y devolver la colección de mapas.

public static Map<String, String> createReplaceMap(String csvfileName){
        Map<String, String> _findReplaceMap = new HashMap<String, String>();
        BufferedReader br = null;
        try {
            String line = "";
            String cvsSplitBy = ",";
            br = new BufferedReader(new FileReader(csvfileName));
            while ((line = br.readLine()) != null) {
                
                // use comma as separator
                String[] findReplace = line.split(cvsSplitBy);

                _findReplaceMap.put(findReplace[0], findReplace[1]);

            }
            br.close();
        
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return _findReplaceMap;
        
    }

Con esto se completa la segunda sección de la herramienta de Buscar y Reemplazar. Ahora entramos en la sección final, y la acción principal de encontrar el string en el archivo y sustituir la cadena. Para esta acción iterativa leemos cada archivo mediante programación y buscamos los valores clave de mapa. Si un valor es encontrado, se reemplazará con el valor correspondiente. Para reemplazar utilizamos el método replace().
Más abajo podéis ver cómo llevarlo a cabo:

System.out.println("*****Find Replace in Files Intialized******");
System.out.print("Find Replace in progress");
for(File file:listOfFiles){
    if(file.isFile()){

        System.out.print(".");

        File convFile = new File(destFolderPath + @"" + file.getName());
        try {
            convFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        findReplace(file, convFile, findReplaceMap);
    }
}
System.out.println("");
System.out.println("****Find Replace Action Completed******");

El código que podéis ver más abajo llama al método findReplace(). A este método hay que pasarle tres argumentos, el primer archivo, como hemos dicho antes, será el fichero de origen, el segundo parámetro contendrá al fichero destino y el tercer parámetro será el mapa findReplace. Si os quedan dudas, mirad el código:

public static Map<String, String> createReplaceMap(String csvfileName){
    Map<String, String> _findReplaceMap = new HashMap<String, String>();
    BufferedReader br = null;
    try {
        String line = "";
        String cvsSplitBy = ",";
        br = new BufferedReader(new FileReader(csvfileName));
        while ((line = br.readLine()) != null) {

            // use comma as separator
            String[] findReplace = line.split(cvsSplitBy);

            _findReplaceMap.put(findReplace[0], findReplace[1]);

        }
        br.close();

    }
    catch(Exception e){
        e.printStackTrace();
    }

    return _findReplaceMap;
}

Y eso ha sido todo. Espero que con este tutorial hayáis podido desarrollar vuestra propia herrmienta para buscar y reemplazar texto en múltiples archivos. Ya sabéis que en programacion.net nos podéis enviar vuestros propios tutoriales, solamente tenéis que hacer uso de la intranet y hacer clic en la sección de Enviar Tutorial.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.