java - 如何在 Java 中使用另一个 CSV 文件中的值创建 CSV 文件而不使用第三方库

标签 java file csv

我有一个 CSV 文件,我正在编写一个程序来处理它。我正在使用 POJO 模型。我可以找到金额的总和。现在我需要编写一个新的 CSV 文件,其中包含日期、总金额列。我怎样才能做到这一点?

PurchaseDetails.java

public class PurchaseDetails {

    public static void main(String args[]) {
        BufferedReader br = null;
        double totalamt = 0; 

        final String COMMA_DELIMITER = ",";
        final String NEW_LINE_SEPARATOR = "\n";

        final String FILE_HEADER = "Date,Total amount";
        FileWriter fileWriter = null;

        try {
            br = new BufferedReader(new FileReader("/home/Desktop/Sample.csv"));
            List<Purchase> pList = new ArrayList<Purchase>();

            String line = "";
            br.readLine();

            while ((line = br.readLine()) != null) {
                String[] purchaseDetails = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");   

                if (purchaseDetails.length > 0) {
                    Purchase purchase1 = new Purchase(purchaseDetails[0], purchaseDetails[1], purchaseDetails[2],
                            purchaseDetails[3], purchaseDetails[4], purchaseDetails[5],
                            purchaseDetails[6], purchaseDetails[7]);
                    pList.add(purchase1);
                }

                String purchase = purchaseDetails[7];
                String purchase1 = purchase.replaceAll("\"", "");
                String purchase2 = purchase1.replaceAll(",", "");
                double d = Double.parseDouble(purchase2);  
                totalamt = totalamt+ d;                 
            }

            DecimalFormat df = new DecimalFormat("#.00");
            String totamount = df.format(totalamt);
            System.out.println("total amount= "+totamount);

            fileWriter = new FileWriter("/home/Desktop/Writecsv.csv");
            fileWriter.append(FILE_HEADER.toString());
            fileWriter.append(NEW_LINE_SEPARATOR);

            for (Purchase purchase : pList) {
                fileWriter.append(purchase.getDate());
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(purchase.getAmount());
                fileWriter.append(NEW_LINE_SEPARATOR);
            }

            System.out.println("CSV file created");
        }
        catch(Exception ee)
        {
            ee.printStackTrace();
        }

    }

}

购买.java

public class Purchase {

    private String date;
    private String custid;
    private String custname;
    private String sgnid;
    private String sgn_name;
    private String orderno;
    private String skuno;
    private String amount;

    public Purchase(String date, String custid, String custname, String sgnid, String sgn_name, String orderno, String skuno, String amount) {
        super();
        this.date=date;
        this.custid=custid;
        this.custname=custname;
        this.sgnid=sgnid;
        this.sgn_name=sgn_name;
        this.orderno=orderno;
        this.skuno=skuno;
        this.amount=amount;
    }

    public Purchase() {
        // TODO Auto-generated constructor stub
    }

    //setters and getters
}

最佳答案

这是一个抽象的 CSV 编写器。 您需要覆盖

String[] extractFields(Object obj)

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.*;

public abstract class AbstractObjectCSVWriter implements ObjectWriter {
    private static final String CSV_DELIMITER = ",";
    private static final int BUFFER_SIZE = 1024 * 20;

    private final Writer writer;

    public AbstractObjectCSVWriter(String fileName, String... fields) {
        writer = createWriter(fileName);
        writeToFile(StringUtils.join(fields, CSV_DELIMITER));
    }

    private Writer createWriter(String fileName)  {
        try {
            FileOutputStream out = new FileOutputStream(new File(fileName));
            return new BufferedWriter(new OutputStreamWriter(out, "UTF-8"), BUFFER_SIZE);
        } catch (IOException e) {
            throw new IllegalStateException("Can't create writer ", e);
        }
    }

    @Override
    public void write(Object obj) {
        StringBuilder builder = new StringBuilder(IOUtils.LINE_SEPARATOR);
        String[] fields = extractFields(obj);
        for (int i = 0; i < fields.length; i++) {
            builder.append(StringEscapeUtils.escapeCsv(fields[i]));
            if (i != fields.length - 1) {
                builder.append(CSV_DELIMITER);
            }
        }
        writeToFile(builder.toString());
    }

    protected abstract String[] extractFields(Object obj);

    protected void writeToFile(String value) {
        try {
            writer.write(value);
        } catch (IOException e) {
            throw new IllegalStateException("Can't write data to file ", e);
        }
    }

    @Override
    public void close() {
        try {
            writer.close();
        } catch (IOException e) {
            throw new IllegalStateException("Can't close writer ", e);
        }
    }
}

关于java - 如何在 Java 中使用另一个 CSV 文件中的值创建 CSV 文件而不使用第三方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57674563/

相关文章:

sql - 在SSIS中将带有逗号分隔符的单列数据拆分为多列

java - OpenCSV 从文件中读取奇怪的文本

python - 尝试在 Python 循环中使用 .csv 文件填充嵌套字典

java - 获取数据库信息到Android中的另一个类

java - 如何在 Javafx 中动态添加新标签

java - Spring Boot 客户端应用程序中未加载属性

Java 不会停止读取输入

c# - 强制打开一个文件

c - 为什么我使用 readdir 进行扫描不会忽略目录?

在C中创建不同名称的文件