Busque una línea en un archivo y elimínela

Resuelto Narek asked hace 15 años • 17 respuestas

Estoy buscando un pequeño fragmento de código que encuentre una línea en el archivo y elimine esa línea (no el contenido sino la línea) pero no pude encontrarla. Entonces, por ejemplo, tengo en un archivo el siguiente:

miArchivo.txt :

aaa
bbb
ccc
ddd

Necesito tener una función como esta: public void removeLine(String lineContent)y si paso removeLine("bbb"), obtengo un archivo como este:

miArchivo.txt:

aaa
ccc
ddd
Narek avatar Sep 04 '09 11:09 Narek
Aceptado

Puede que esta solución no sea óptima ni bonita, pero funciona. Lee un archivo de entrada línea por línea y escribe cada línea en un archivo de salida temporal. Cada vez que encuentra una línea que coincide con lo que está buscando, omite escribirla. Luego cambia el nombre del archivo de salida. He omitido el manejo de errores, el cierre de lectores/escritores, etc. del ejemplo. También asumo que no hay espacios en blanco al principio o al final en la línea que está buscando. Cambie el código alrededor de trim() según sea necesario para que pueda encontrar una coincidencia.

File inputFile = new File("myFile.txt");
File tempFile = new File("myTempFile.txt");

BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

String lineToRemove = "bbb";
String currentLine;

while((currentLine = reader.readLine()) != null) {
    // trim newline when comparing with lineToRemove
    String trimmedLine = currentLine.trim();
    if(trimmedLine.equals(lineToRemove)) continue;
    writer.write(currentLine + System.getProperty("line.separator"));
}
writer.close(); 
reader.close(); 
boolean successful = tempFile.renameTo(inputFile);
SingleShot avatar Sep 04 '2009 05:09 SingleShot
    public void removeLineFromFile(String file, String lineToRemove) {

    try {

      File inFile = new File(file);

      if (!inFile.isFile()) {
        System.out.println("Parameter is not an existing file");
        return;
      }

      //Construct the new file that will later be renamed to the original filename.
      File tempFile = new File(inFile.getAbsolutePath() + ".tmp");

      BufferedReader br = new BufferedReader(new FileReader(file));
      PrintWriter pw = new PrintWriter(new FileWriter(tempFile));

      String line = null;

      //Read from the original file and write to the new
      //unless content matches data to be removed.
      while ((line = br.readLine()) != null) {

        if (!line.trim().equals(lineToRemove)) {

          pw.println(line);
          pw.flush();
        }
      }
      pw.close();
      br.close();

      //Delete the original file
      if (!inFile.delete()) {
        System.out.println("Could not delete file");
        return;
      }

      //Rename the new file to the filename the original file had.
      if (!tempFile.renameTo(inFile))
        System.out.println("Could not rename file");

    }
    catch (FileNotFoundException ex) {
      ex.printStackTrace();
    }
    catch (IOException ex) {
      ex.printStackTrace();
    }
  }

Esto lo he encontrado en internet.

Narek avatar Sep 04 '2009 19:09 Narek

Quieres hacer algo como lo siguiente:

  • Abra el archivo antiguo para leerlo.
  • Abra un archivo nuevo (temporal) para escribir
  • Iterar sobre las líneas del archivo antiguo (probablemente usando un BufferedReader )
    • Para cada línea, verifique si coincide con lo que se supone que debe eliminar
    • Si coincide no hagas nada
    • Si no coincide, escríbalo en el archivo temporal.
  • Cuando termine, cierre ambos archivos.
  • Eliminar el archivo antiguo
  • Cambie el nombre del archivo temporal al nombre del archivo original

(No escribiré el código real, ya que parece una tarea, pero siéntete libre de publicar otras preguntas sobre partes específicas con las que tengas problemas)

Adam Batkin avatar Sep 04 '2009 05:09 Adam Batkin