我有一个 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/