java - 将特定行和列的 .csv 转换为 .xls 值加倍

标签 java csv

我有下面的 csv 文件,其中包含以下数据,我想在 POI jar 的帮助下将这些数据转换成 excel 文件为 2003 格式,所以我为此使用 poi 3.10 版本。

将其转换为 .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 是 Brokerage Estimated,Upfront Fee 然后第六列的值是 Upfront Fee 这是不正确的第六列的值为 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
    }
}

请各位大侠指教

任何早期帮助将不胜感激

最佳答案

不要使用 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

关于java - 将特定行和列的 .csv 转换为 .xls 值加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35320059/

相关文章:

Java - 如何拆分基于列的字符串?

java - 在 Java 中模拟链式调用的最佳解决方案

python - Pandas read_csv中的日期时间dtypes

python - 如何使用子进程和 'cat'逐行读入数据?

linux - 如何使用 awk、sed、剪切、粘贴 (Unix/Linux) 偏移 CSV 文件中的字段?

python - 如何在Python中将JSON字符串保存为CSV或TXT?

java - 关于 android onCreate()c 中数据库 Activity 的问题

java - 在方法参数内声明变量

java - 简单的字符串错误

csv - 有没有办法在 writetable() 中使用字符串作为分隔符 - Julia