2013-12-02 2 views
2

Я пишу программу на Java, которая записывает несколько строк информации в файл CSV. Я хочу удалить последнюю строку CSV-файла, поскольку он не нужен. Как бы это сделать, поскольку файл CSV создается PrintWriter, и я не верю, что метод append мог бы это сделать.Как удалить строку в PrintWriter

Дополнительная строка написана потому, что цикл продолжается для одной дополнительной строки. Эта часть кода выглядит следующим образом:

public static void obtainInformation() throws IOException { 

    PrintWriter docketFile = new PrintWriter(new FileWriter("ForclosureCourtDockets"+startingMonth+"_"+startingDay+"_"+startingYear+"-"+endingMonth+"_"+endingDay+"_"+endingYear+".csv", true)); 
    pageContentString = pageContentString.replace('"','*'); 
    int i = 0; 
    boolean nextDocket = true; 

    while(nextDocket) { 
     nextDocket = false; 

     String propertyCity = "PropertyCity_"+i+"*>"; 
     Pattern propertyCityPattern = Pattern.compile("(?<="+Pattern.quote(propertyCity)+").*?(?=</span>)"); 
     Matcher propertyCityMatcher = propertyCityPattern.matcher(pageContentString); 

     while (propertyCityMatcher.find()) { 
     docketFile.write(i+propertyCityMatcher.group().toString()+", "); 
     nextDocket = true; 
     } 

     String descriptionValue = "Description_"+i+"*>"; 
     Pattern descriptionPattern = Pattern.compile("(?<="+Pattern.quote(descriptionValue)+").*?(?=</span>)"); 
     Matcher descriptionMatcher = descriptionPattern.matcher(pageContentString); 

     while (descriptionMatcher.find()) { 
     docketFile.write(descriptionMatcher.group().toString()+"\n"); 
     } 

     i++; 
    } 

    docketFile.close(); 

    } 

public static void removeLineFromFile() { 

try { 

    File inFile = new File("ForclosureCourtDockets"+startingMonth+"_"+startingDay+"_"+startingYear+"-"+endingMonth+"_"+endingDay+"_"+endingYear+".csv"); 

    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("ForclosureCourtDockets"+startingMonth+"_"+startingDay+"_"+startingYear+"-"+endingMonth+"_"+endingDay+"_"+endingYear+".csv")); 
    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("^^^^^^^^^^^^^")) { 

     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(); 
} 
} 
+2

Вы можете не писать эту строку вместо этого? – kiruwka

+0

Можете ли вы разместить код? Что вы пробовали? – rmlan

+0

Вы правы. Писатели похожи на OutputStreams. Они просто добавляются каждый раз, когда вызывается их метод записи. Почему вы пишете строку в первую очередь, когда позже хотите удалить ее снова? – isnot2bad

ответ

3

Ну, а PrintWriter просто Writer, который может только append/write/print
Таким образом, вы не можете переопределить строку, которая только что написали.
Несколько вариантов у вас есть:

  • Измените вашу логику, чтобы убедиться, что вы не пишете строку, которую необходимо удалить в конце концов (я думаю, что наиболее логичный вариант)
  • После записи в файл вы можете использовать другой Reader (скажем, BufferedReader), чтобы прочитать его снова, а затем переписать его, без строки, которую вы хотели бы исключить.
  • RandomAccessFile и его метод seek для возврата и перезаписи/удаления нужной строки.
+0

обновил код, чтобы отразить код для удаления кареток. – Ctech45

0

Вы можете сделать следующее (это способ реализации первого предложения kiruwka в):

1) написать первую строку за пределами цикла.

2) Затем для каждой строки, написанной в цикле while, сначала выводите новую строку и только затем выводите строку csv.

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