2016-04-03 4 views
1

Ich habe eine Textdatei mit folgendem Format:Wie entferne ich eine Dateizeile von einer anderen Zeile in der gleichen Datei?

String1

String1String2

String1String2String3

....

String1Strin2String3 ..... String (i). ..String (n)

Ich möchte einige Teile dieser Datei entfernen, um das folgende Formular zu haben bei (Ergebnisdatei):

String1

String2

String3

...

String (i)

String (n)

Ich habe versucht, mit dieser Funktion aber meine Ausgabedatei ist immer leer:

public static void FileFormatted(String inputFile,String outputFile) 
    { 
     String FileContent = readFile(inputFile, 
       StandardCharsets.UTF_8); 
     String[] FileSentences = FileContent.split("[\n]"); 
     for (int i = 0; i < FileSentences.length; i++) 
     { 


      StringBuilder builder = new StringBuilder(); 
       for(int j=1;j<FileSentences.length;j++) 
        { 
        int index= FileSentences[j].indexOf("FileSentences[i]"); 
        String temp=FileSentences[j].substring(index); 
        FileSentences[j]=FileSentences[j].replaceAll(temp," "); 
         builder.append(FileSentences[j]+ "\n"); 
        } 
       writeIntoFile(builder, outputFile, true); 

     } 


    } 
public static void writeIntoFile(StringBuilder stringBuilder, 
      String txtFilePath, boolean append) { 
     File file = new File(txtFilePath); 

     // if file doesn't exists, then create it 
     if (!file.exists()) { 
      try { 
       file.createNewFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     FileWriter fw; 
     try { 
      fw = new FileWriter(file.getAbsoluteFile(), append); 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write(stringBuilder.toString()); 
      bw.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

Kann mir bitte jemand helfen.

Antwort

1

Okay, zunächst einmal das Lesen der ganze Datei in, auf einmal ist eine schlechte Übung. Stellen Sie sich vor, Sie haben eine 6-GB-Datei, dh Sie benötigen 6 GB RAM, um diese Datei beim Einlesen zu speichern. Es wäre besser, die Datei Zeile für Zeile zu lesen.

Also das Ziel der Logik würde Zeile für Zeile gelesen werden. Wenn wir die erste Zeile lesen, bekommen wir die Länge davon. Wenn wir die zweite Zeile lesen lesen wir die Länge der ersten Zeile, das heißt, es ist unser Ausgangspunkt in der zweiten Zeile. Das bedeutet, dass Sie die Sub-String-Methode verwenden können, indem Sie die Startposition und die Endposition übergeben. Wiederholen Sie diese Logik für Zeile 3,4, ... n

Der Vorteil davon ist, dass Sie keinen Speicher verschwenden, Sie speichern nur die Größe der Zeile im Text.

aktualisieren

ich den Code geschrieben haben, die ich früher vorgeschlagen. Es ist ziemlich einfach und es gibt keine Validierung, so dass Sie hinzufügen müssen. Aber es werden die Grundlagen

public static void main(String[] args) throws IOException { 

    FileReader fileReader = new FileReader("test.txt"); 
     BufferedReader br = new BufferedReader(fileReader); 

     int startPosition = 0; 
     String line; 
     ArrayList<String> items = new ArrayList<String>(); 
     while((line = br.readLine()) != null) 
     { 
      items.add(line.substring(startPosition, line.length())); 
      System.out.println(line.substring(startPosition, line.length())); 
      startPosition = line.length(); 

     } 

     write("test2.txt", items); 
} 

public static void write (String filename, ArrayList<String> items) throws IOException{ 

    BufferedWriter outputWriter = null; 
    outputWriter = new BufferedWriter(new FileWriter(filename)); 

    for (String item : items) { 

     outputWriter.write(item); 
     outputWriter.newLine(); 
    } 
    outputWriter.flush(); 
    outputWriter.close(); 
} 
+0

danke für Ihre Lösung ... es ist perfekt für mich ... wirklich hilfreich – Amira

0

sicher sein, das Muster in dem Loch Datei konsistent ist, dann tun:

public static void main(String[] args) { 
    String wordTofind = "String"; 
    String st = "String1String2String3String4"; 
    String[] arra = st.split(wordTofind); 
    for (int i = 1; i < arra.length - 1; i++) { 
     System.out.println(wordTofind + arra[i]); 
     //write to a file or similar. 


    } 
} 

Sie Regex verwenden, aber das ist akzeptabel ...

+0

Die Datei, die ich gab, war ein exemple, aber im wirklichen Saiten haben nicht die gleiche Länge – Amira

+0

Sie haben keine Muster, das Sie gegen REGEX bieten kann ???? –

+0

Mein Ziel ist es, meine Saiten zu trennen und keine redundanten zu haben. – Amira

Verwandte Themen