2016-09-07 23 views
0

Я хочу вырезать текстовый файл. Я хочу вырезать файл 50 строк на 50 строк.Разделить файл на несколько файлов

Например, если файл содержит 1010 строк, я бы восстановил 21 файл.

Я знаю, как подсчитать количество файлов, количество строк, но как только я напишу, это не работает.

Я использую Camel Simple (Talend), но это код Java.

private void ExtractOrderFromBAC02(ProducerTemplate producerTemplate, InputStream content, String endpoint, String fileName, HashMap<String, Object> headers){ 
     ArrayList<String> list = new ArrayList<String>(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(content)); 
     String line; 
     long numSplits = 50;     
     int sourcesize=0; 
     int nof=0; 
     int number = 800; 
     try {    
      while((line = br.readLine()) != null){ 
        sourcesize++; 
        list.add(line); 
      } 

     System.out.println("Lines in the file: " + sourcesize);  

     double numberFiles = (sourcesize/numSplits); 
     int numberFiles1=(int)numberFiles; 
       if(sourcesize<=50) { 
        nof=1; 
       } 
       else { 
        nof=numberFiles1+1; 
       } 
     System.out.println("No. of files to be generated :"+nof); 

     for (int j=1;j<=nof;j++) { 
       number++; 
       String Filename = ""+ number; 
       System.out.println(Filename); 

      StringBuilder builder = new StringBuilder(); 
      for (String value : list) { 
       builder.append("/n"+value); 
      } 

      producerTemplate.sendBodyAndHeader(endpoint, builder.toString(), "CamelFileName",Filename); 
     } 

      } 

     } catch (IOException e) { 
       e.printStackTrace(); 
     } 
      finally{ 
       try { 
        if(br != null)br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

Для людей, которые не знают, верблюд, эта линия используется для отправки файла:

producerTemplate.sendBodyAndHeader (endpoint, line.toString(), "CamelFileName" Filename); 

конечная точка ==> Destination (это нормально с другим кодом)

линии. ToString() ==> Значения

И затем имя файла (это нормально с другим кодом)

ответ

0

считать Первые линии

while((line = br.readLine()) != null){ 
        sourcesize++; } 

, а затем вы в конце файла: вы ничего не читали

for (int i=1;i<=numSplits;i++) { 
       while((line = br.readLine()) != null){ 

Вы должны искать обратно в начало файла, прежде чем читать снова.

Но это пустая трата времени & мощности, потому что вы будете читать файл дважды

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

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

for (String value : list) { 
       builder.append("/n"+value); 
      } 

Вы должны использовать индексы в списке для создания небольших файлов.

for (int k=0;k<numSplits;k++) { 
     builder.append("/n"+list[current_line++]); 

current_line является глобальным счетчиком строк в файле. Таким образом, вы каждый раз создаете файлы из 50 разных строк :)

+0

Merci Jean-François! Я применил некоторые изменения (см. Мой код). Я создаю 3 файла, но я не могу их нарезать, каждый файл содержит весь исходный файл. И с помощью списка массивов возврат каретки не выполняется. – Valentino

+0

Спасибо, Жан-Франсуа! Я, должно быть, глупый ... :) Кажется странным для цикла 50 раз: 'for (int k = 0; k Valentino

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