【问题标题】:How to create a CSV file using the values from another CSV file in Java without using third party library如何在不使用第三方库的情况下使用 Java 中另一个 CSV 文件中的值创建 CSV 文件
【发布时间】:2019-08-27 12:20:13
【问题描述】:

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

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();
        }

    }

}

Purchase.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
}

【问题讨论】:

  • 您列出的代码似乎符合您的要求。有什么不适合它的吗?你真正的问题是什么?
  • @RogerGustavsson 我需要创建一个新的 csv 文件,其中包含列日期、总金额。这是每个日期的总金额。
  • @RogerGustavsson 我可以创建一个新的 CSV 文件。但是如何制作日期,该文件中每个日期的总数
  • 重新格式化的代码段

标签: java file csv


【解决方案1】:

这是一个抽象的 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多