2017-04-18 2 views
3

Ich habe eine input.txt Datei, die aus 520 Zeilen bestehen. Ich muss einen Code in Java machen, der sich so verhält.Erstellen Sie mehrere Dateien aus einer Textdatei in Java

Erstellen Sie die erste Datei mit dem Namen file-001.txt aus den ersten 200 Zeilen. dann erstellen Sie eine weitere file-002 von 201-400 Zeilen. dann file-003.txt aus den restlichen Zeilen.

Ich habe dies codiert, es schreiben nur die ersten 200 Zeilen. Welche Änderungen muss ich vornehmen, um das obige Szenario zu aktualisieren?

public class DataMaker { 
public static void main(String args[]) throws IOException{ 
    DataMaker dm=new DataMaker(); 
    String file= "D:\\input.txt"; 
    int roll=1; 
    String rollnum ="file-00"+roll; 
    String outputfilename="D:\\output\\"+rollnum+".txt"; 
    String urduwords; 
    String path; 
    ArrayList<String> where = new ArrayList<String>(); 
    int temp=0; 
    try(BufferedReader br = new BufferedReader(new FileReader(file))) { 
      for(String line; (line = br.readLine()) != null;) { 
       ++temp; 
       if(temp<201){ //may be i need some changes here 
       dm.filewriter(line+" "+temp+")",outputfilename); 
       } 
      } 
     } catch (FileNotFoundException e) { 
      System.out.println("File not found"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
} 
void filewriter(String linetoline,String filename) throws IOException{ 
    BufferedWriter fbw =null; 
    try{ 

     OutputStreamWriter writer = new OutputStreamWriter(
       new FileOutputStream(filename, true), "UTF-8"); 
      fbw = new BufferedWriter(writer); 
     fbw.write(linetoline); 
     fbw.newLine(); 

    }catch (Exception e) { 
     System.out.println("Error: " + e.getMessage()); 
    } 
    finally { 
     fbw.close(); 
     } 
} 

} 

Eine Möglichkeit kann Gebrauch von if else sein, aber ich kann es nur benutzen, weil meine eigentliche Datei 6000+ Linien ist.

Ich möchte, dass dieser Code funktioniert, wie ich den Code ausführen und mir mehr als 30 Ausgabedateien geben.

+0

Wahrscheinlich auf dem richtigen Weg hier. Statt <201, sehen Sie [modulus arithmatic] (http://stackoverflow.com/questions/90238/whats-the-syntax-for-mod-in-java). –

Antwort

1

Sie können folgende Bit ändern:

if(temp<201){ //may be i need some changes here 
    dm.filewriter(line+" "+temp+")",outputfilename); 
} 

dazu:

dm.filewriter(line, "D:\\output\\file-00" + ((temp/200)+1) + ".txt"); 

Dies wird sicher ersten 200 Zeilen gehen auf erste Datei, machen nächsten 200 Zeilen gehen nächste Datei und so weiter .

Sie könnten auch 200 Zeilen zusammen gruppieren und sie in einem Schritt schreiben, anstatt ein writer jedes Mal zu erstellen und in Datei zu schreiben.

+0

Sie haben gerade die Daten geändert, die in die Datei geschrieben werden. Es hat nichts mit dem Namen der Ausgabedatei zu tun. guck bitte nochmal nach. –

+0

@AdnanAli danke für die Eingabe, aktualisiert die Antwort. –

+0

Lassen Sie mich Ihnen sagen, wie das funktioniert. Ich gab 1083 Zeilen input.txt Datei. und Code erstellt 200 Textdateien mit jeweils 5 Zeilen. damit. 200x5 = 1000 und 83 Zeilen, die gerade verschwunden sind –

0

Sie eine Methode hat, die die Writer die aktuellen File schafft, zu limit Anzahl der Zeilen liest auf, schließt die Writer die aktuellen File, dann kehrt true wenn es genug zu lesen hat, false wenn es nicht konnte Lesen Sie die Anzahl der Zeilen (dh brechen Sie den nächsten Anruf ab, versuchen Sie nicht mehr Zeilen zu lesen oder schreiben Sie die nächste Datei).

Dann würden Sie dies in einer Schleife, die Reader, den neuen Dateinamen und die Limit-Nummer übergeben. Hier

ein Beispiel:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

public class DataMaker { 
    public static void main(final String args[]) throws IOException { 
     DataMaker dm = new DataMaker(); 
     String file = "D:\\input.txt"; 
     int roll = 1; 
     String rollnum = null; 
     String outputfilename = null; 

     boolean shouldContinue = false; 

     try (BufferedReader br = new BufferedReader(new FileReader(file))) { 

      do { 

       rollnum = "file-00" + roll; 
       outputfilename = "D:\\output\\" + rollnum + ".txt"; 
       shouldContinue = dm.fillFile(outputfilename, br, 200); 
       roll++; 
      } while (shouldContinue); 

     } catch (FileNotFoundException e) { 
      System.out.println("File not found"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private boolean fillFile(final String outputfilename, final BufferedReader reader, final int limit) 
      throws IOException { 

     boolean result = false; 
     String line = null; 
     BufferedWriter fbw = null; 
     int temp = 0; 
     try { 
      OutputStreamWriter writer = new OutputStreamWriter(
        new FileOutputStream(outputfilename, true), "UTF-8"); 
      fbw = new BufferedWriter(writer); 

      while (temp < limit && ((line = reader.readLine()) != null)) { 

       temp++; 
       fbw.write(line); 
       fbw.newLine(); 

      } 

      // abort if we didn't manage to read the "limit" number of lines 
      result = (temp == limit); 

     } catch (Exception e) { 
      System.out.println("Error: " + e.getMessage()); 
     } finally { 
      fbw.close(); 
     } 

     return result; 

    } 

} 
Verwandte Themen