2015-05-19 2 views
3

У меня есть немного кода, чтобы найти строку в текстовом файле, напечатать строку, на которой находится строка, а затем распечатать 5 строк под ней. Однако мне нужно изменить его, чтобы вместо печати он удалял/удалял строку после того, как строка найдена. Как мне это сделать?Найти строку в текстовом файле, удалить строку и строки ниже

File file = new File("./output.txt"); 
Scanner in = null; 
try { 
    in = new Scanner(file); 
    while (in.hasNext()) { 
     String line = in.nextLine(); 
     if (line.contains("(1)")) { 
      for (int a = 0; in.hasNextLine() && a < 6; a++) { 
       System.out.println(line); 
       line = in.nextLine(); 
      } 
     } 
    } 
} catch (Exception e) { 
} 
+0

Вы хотите удалить строку, которая следует за строкой, содержащей строку или все строки, следующие за строкой, содержащей строку? Сколько строк может содержать ваш входной файл? – SubOptimal

+0

Включая строку и пять следующих строк. – wj381

+1

Создайте 'StringBuilder' и добавьте строки, которые вам нужны для этого объекта, а затем с помощью' FileWriter' перепишите файл – Blip

ответ

3

Найти небольшой фрагмент, с которого вы можете начать.

Предполагая, что ваш question.txt имеет следующий вход.

line 1 
line 2 
line 3 (1) 
line 4 
line 5 
line 6 
line 7 
line 8 
line 9 
line 10 

Этот фрагмент кода будет печатать все строки и пропустить строку line 3 (1), а пять линий после.

List<String> lines = Files.readAllLines(Paths.get("question.txt"), Charset.defaultCharset()); 
for (int i = 0; i < lines.size(); i++) { 
    if (lines.get(i).contains("(1)")) { 
     i = i + 6; 
    } 
    System.out.println(lines.get(i)); 
} 

выход

line 1 
line 2 
line 9 
line 10 

Для хранения строк в файл остается для вас.

1

мое предложение сначала объявить и инициализировать StringBuilder сказать output перед вашим выше кодом, как:

StringBuilder output = new StringBuilder(); 

Теперь после закрытия if заявления перед закрытием цикла while добавьте строку в output и добавить "\n" в конце, как это:

output.append(line+"\n"); 

Теперь, наконец, после того, как код, который вы выложили мето ьная FileWriter сказать writer, а затем использовать писатель, чтобы написать output, как показано ниже:

try(FileWriter writer = new FileWriter(file, false)){ 
    writer.write(output); 
}catch IOException(e){ 
    e.printStackTrace(); 
} 

Также не забудьте удалить или закомментировать следующую строку, если вы не хотите их напечатанными на выходе.

System.out.println(line); 
0

SubOtimal имеет хороший, лаконичный ответ, который будет работать в большинстве случаев. Следующее является более сложным, но позволяет избежать загрузки всего файла в память. Это, вероятно, не является проблемой для вас, но на всякий случай ...

public void deleteAfter(File file, String searchString, int lineCountToDelete) { 
    // Create a temporary file to write to 
    File temp = new File(file.getAbsolutePath() + ".tmp"); 
    try (BufferedReader reader = new BufferedReader(new FileReader(file)); 
     PrintWriter writer = new PrintWriter(new FileWriter(temp))) { 

     // Read up to the line we are searching for 
     // and write each to the temp file 
     String line; 
     while((line = reader.readLine()) != null && !line.equals(searchString)){ 
      writer.println(line); 
     } 

     // Skip over the number of lines we want to "delete" 
     // as well as watching out for hitting the end of the file 
     for(int i=0;i < lineCountToDelete && line != null; i++){ 
      line = reader.readLine(); 
     } 

     // Write the remaining lines to the temp file. 
     while((line = reader.readLine()) != null){ 
      writer.println(line); 
     } 

    } catch (IOException e) { 
     throw new IllegalStateException("Unable to delete the lines",e); 
    } 

    // Delete the original file 
    if(!file.delete()){ 
     throw new IllegalStateException("Unable to delete file: " + file.getAbsolutePath()); 
    } 

    // Rename the temp file to the original name 
    if(!temp.renameTo(file)){ 
     throw new IllegalStateException("Unable to rename " + 
       temp.getAbsolutePath() + " to " + file.getAbsolutePath()); 
    } 
} 

Я испытал это с несколькими условиями, в том числе линии, которая не существует, линия в конце и линии с меньшим количеством строк слева от числа, которое нужно пропустить. Все работали и дали соответствующие результаты.

Смежные вопросы