2016-02-10 2 views
3

У меня есть следующий файл csv, который содержит следующие данные, которые я хочу преобразовать в файл Excel в формате 2003 с помощью POI-банок, поэтому я используя для этого версию poiz 3.10.преобразование .csv в .xls для строки и столбца значения удваивается

при преобразовании его в файл .xls необходимо соблюдать особую осторожность для столбца PAYMENT_TYPE, поскольку его значение между ними состоит из запятой, но это не следует рассматривать как разделитель, и значение начинается с двойных кавычек и заканчивается двойными кавычками, поэтому что следует рассматривать как одно значение, поэтому позиция столбца PAYMENT_TYPE также фиксируется в файле CSV, что она будет всегда находиться на пятом месте так ниже это файл .csv

REC_STATUS,TRADE_ID,SETTLEMENT_DATE,TRADE_EFFECTIVE_DATE,PAYMENT_TYPE,VERSION,BREAK_DOWN_BUCKET,CAUSE,NUM_CASHFLOWS_AFFECTED,PROFILE 
Found only in File :B,178942690,01-Feb-16,03-Dec-14,"Coupon",5,NOISY_BREAK_BUCKET,REC_TOOL_ISSUE_PAYMENT_DIRECTION_MISMATCH | REC_TOOL_ISSUE_NOTIONAL_MISMATCH | TRADE_VERSION,1,AVS Offshore 
Found only in File :A,197743320,Various,21-Dec-15,"Brokerage Estimated,Upfront Fee",1,ACTUAL DATA BREAK BUCKET,ACTUAL_DATA_BREAK,2,AVS Offshore 

теперь у меня есть код, чтобы преобразовать его в .xls, как показано ниже, единственная проблема с этим файлом .xls заключается в том, что когда я открываю этот файл .xls, значение второй строки не подходит правильно, то есть значение пятого столбца в excel является оценкой брокера, Искренняя Плата, а затем шестое значение столбца авансового взноса, который не исправить значение шестого столбца 1, пожалуйста, посоветуйте, как я могу это исправить в моем ниже фрагменте кода

package test; 

import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Cell; 

public class CSVToExcelConverter { 

    public static void main(String args[]) throws IOException 
    { 
     ArrayList arList=null; 
     ArrayList al=null; 
     String fName = "C:\\Vabc.csv"; 
     String thisLine; 
     int count=0; 
     FileInputStream fis = new FileInputStream(fName); 
     DataInputStream myInput = new DataInputStream(fis); 
     int i=0; 
     arList = new ArrayList(); 
     while ((thisLine = myInput.readLine()) != null) 
     { 
      al = new ArrayList(); 
      String strar[] = thisLine.split(","); 
      for(int j=0;j<strar.length;j++) 
      { 
       if(j == 4){ 
        al.add(strar[j] + "," + strar[j+1]); 
        j++; 
       } 
       al.add(strar[j]); 
      } 
      arList.add(al); 
      System.out.println(); 
      i++; 
     } 

     try 
     { 
      HSSFWorkbook hwb = new HSSFWorkbook(); 
      HSSFSheet sheet = hwb.createSheet("new sheet"); 
      for(int k=0;k<arList.size();k++) 
      { 
       ArrayList ardata = (ArrayList)arList.get(k); 
       HSSFRow row = sheet.createRow((short) 0+k); 
       for(int p=0;p<ardata.size();p++) 
       { 
        HSSFCell cell = row.createCell((short) p); 
        String data = ardata.get(p).toString(); 
        if(data.startsWith("=")){ 
         cell.setCellType(Cell.CELL_TYPE_STRING); 
         data=data.replaceAll("\"", ""); 
         data=data.replaceAll("=", ""); 
         cell.setCellValue(data); 
        }else if(data.startsWith("\"")){ 
         data=data.replaceAll("\"", ""); 
         cell.setCellType(Cell.CELL_TYPE_STRING); 
         cell.setCellValue(data); 
        }else{ 
         data=data.replaceAll("\"", ""); 
         cell.setCellType(Cell.CELL_TYPE_NUMERIC); 
         cell.setCellValue(data); 
        } 
//*/ 
// cell.setCellValue(ardata.get(p).toString()); 
       } 
       System.out.println(); 
      } 
      FileOutputStream fileOut = new FileOutputStream("C:\\test.xls"); 
      hwb.write(fileOut); 
      fileOut.close(); 
      System.out.println("Your excel file has been generated"); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } //main method ends 
    } 
} 

людей пожалуйста советуют для этого

любая ранняя помощь была бы очень благодарна

+0

Вы должны взглянуть на какую-то библиотеку CSV (например, [opencsv] (http://opencsv.sourceforge.net/), например) –

+0

пожалуйста, сообщите, как я могу исправить мою выше логику, пожалуйста, – sss

ответ

1

Не используйте split() для анализа данных csv, особенно если в некоторых полях есть запятая.

String strar[] = thisLine.split(","); 
for(int j=0;j<strar.length;j++) 
{ 
    if(j == 4){ 
     al.add(strar[j] + "," + strar[j+1]); 
      j++; 
    } 
    al.add(strar[j]); 
} 

В приведенном выше коде строка разделена на , и длины strar будет разным в зависимости от , присутствует в PAYMENT_TYPE.

Затем вы проверяете номер столбца, в котором вы находитесь, и всегда добавляете , и следующее значение - даже если PAYMENT_TYPE не содержит ,.

Данные csv являются действительными и правильно цитируются.

Вот некоторые псевдо-код, чтобы правильно разобрать его:

read a line 

bool bInsideQuotes = false 

loop over chars 
    if character == '"' 
    bInsideQuotes = !bInsideQuotes 
    if character == ',' and !bInsideQuotes 
    found a field separator 
+0

Хорошо Спасибо большое было бы здорово, если вы можете добавить это в мой выше код, чтобы я мог больше узнать спасибо – sss

+0

@sss - Все, что вам нужно сделать сохраните startpos поля, перейдем к следующему действительному разделителю, учитывая цитированные поля (см. псевдо-код выше), возьмите подстроку startpos-> currentpos, установите startpos 1 за текущие точки и повторите до конца строки. –

+0

Еще раз спасибо, но реализация java, как я сделал в моей программе, очень поможет, поэтому попросите вас, если вы можете сделать то же самое Спасибо заранее. – sss

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