[英]How to create a CSV file using the values from another CSV file in Java without using third party library
I have a CSV file and I am writing a program to process it. 我有一个CSV文件,正在编写一个程序来处理它。 I am using POJO model.
我正在使用POJO模型。 I can find the sum of amount.
我可以找到金额的总和。 Now I need to write a new CSV file with column Date,Total amount.
现在,我需要写一个新的CSV文件,其列为Date,Total amount。 How can I do this?
我怎样才能做到这一点?
PurchaseDetails.java 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 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
}
Here is an abstract CSV writer. 这是抽象的CSV编写器。 You need override
您需要覆盖
String[] extractFields(Object obj)
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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.