2015-03-20 5 views
0

У меня есть программа java, которая работает на мейнфрейме z/os и читает файл EBCDIC. Несколько строк в файле имеют несколько записей, разделенных EBCDIC 'LF' X'025 '. Я использую Java readline и, как и ожидалось, читает запись до перевода строки и отбрасывает остальную часть записей. Помимо синтаксического анализа большой строки на несколько записей, есть ли способ заставить методы чтения разделить строку на несколько строк/записей и вернуть их? Если необходимо, у меня есть возможность изменить разделитель новой строки на любые значения.Чтение строки с несколькими разрывами строк в виде отдельных строк

Вход:

10,IBM,ERWIN,BLACK,123,ABC(LF)10,IBM,JACK,ROSE,456 

Ожидаемый результат

10,IBM,ERWIN,BLACK,123,ABC 
10,IBM,JACK,ROSE,456 

Текущий код:

public ArrayList<String> readMainframeFile() 
    { 
     //String DDNAME = ZFile.allocDummyDDName(); 
     //System.out.println("The DDName is " + DDNAME); 
     //ZFile convout = new ZFile("//DD:CONVOUT", "wb,type=record,noseek"); 

     //RecordReader reader=null; 

     try { 
      ZFile convin = new ZFile("//DD:CONVIN", "rb,type=record,noseek"); 
      System.out.println("The DDName is" + convin.getLrecl()); 
      byte[] recordBuf = new byte[convin.getLrecl()]; 
      int bytesRead=0; 
      InputStream ins = null; 
      BufferedReader reader = null; 
      String temp=null; 
      ArrayList<String> lines = new ArrayList<String>(); 

      while((bytesRead = convin.read(recordBuf)) > 0) { 
       //System.out.println("The number of bytes read is" + bytesRead); 
       try { 
        ins = new ByteArrayInputStream(recordBuf); 
        reader = new BufferedReader(new InputStreamReader(ins,Charset.forName("ibm500"))); 
        temp=reader.readLine(); 
        lines.add(temp); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        return null; 
       } 

      } 
      return lines; 

     } catch (ZFileException e) { 
      System.err.println(e.getMessage()); 
      return null; 
      } 
     } 
+0

Каковы основные критерии разделения линии? Я угадываю его '(LF)' – Smit

+1

Вы должны зациклиться на 'readLine()' до тех пор, пока он не вернет null. Вы также игнорируете 'bytesRead' при построении' ByteArrayInputStream''. – EJP

ответ

0

Вы открываете диафрагменное ile для двоичного ввода-вывода QSAM, когда вы должны открывать его в виде текстового потока.

ZFile convin = new ZFile("//DD:CONVIN", "r"); 

Затем просто прочитайте записи, как обычно, с потоком. Нет необходимости в дополнительном считывателе строк. z/OS Новые строки UNIX обычно x'15 ', поэтому вам может понадобиться изменить свой символ перевода строки.

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