1. 需求和思路
最近要用java制作一个数据集,每一行是一个样本,格式是csv。用了一下java类的相关概念,把csv文件里的每一行,即每一个样本视为一个类。
2. 现有方法
目前已有的csv包如opencsv,可以支持字符串,也可以支持javabean(即java类)。相关教程如下
Java OpenCSV|极客教程 (geek-docs.com)https://geek-docs.com/java/java-tutorial/java-opencsv.html由于墙的原因,我maven老是下载不到opencsv的jar包,没办法我只能手写个平民版的
3. 代码
自定义的CodeObject类
public class CodeObject {
private String filePath;
private String methodName;
private String content;
public void setFilePath(String filePath){ this.filePath = filePath;}
public void setMethodName(String methodName) { this.methodName = methodName;}
public void setContent(String content) { this.content = content;}
public String getFilePath() { return filePath;}
public String getMethodName() { return methodName;}
public String getContent() { return content;}
}
mycsv类
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class mycsv {
private File csvFile;
public mycsv(String fileName){
try {
csvFile = new File(fileName);
if (!csvFile.exists()){
csvFile.createNewFile();
}
}catch (IOException e){
System.out.println("error in io");
}
}
public void writeCSVFile(String header[], ArrayList<CodeObject> cos){
try{
FileWriter fw = new FileWriter(csvFile);
BufferedWriter bw = new BufferedWriter(fw);
// 写表头
for (int i = 0; i < header.length; i++){
if (i < header.length-1){
bw.append(header[i] + ",");
}else{
bw.append(header[i] + "\r\n");
}
}
// 写数据
for(CodeObject co: cos){
bw.append(co.getFilePath()+",");
bw.append(co.getMethodName()+",");
bw.append(CSVFormatter(co.getContent())+"\r\n");
}
bw.close();
fw.close();
}catch (IOException e){
System.out.println("error in io");
}
}
public String CSVFormatter(String s){
if (s == null) {
return "";
}
if (s.contains("\"")) {
s = s.replaceAll("\"", "\"\"");
}
return "\"" + s + "\"";
}
}
调用方式
public static void main(String[] args) {
ArrayList<CodeObject> methods = new ArrayList<>();
/*
一些操作将数据写入methods中
*/
String header[] = {"FilePath", "MethodName", "Content"};
mycsv m = new mycsv("a.csv");
m.writeCSVFile(header, methods);
}
4. 参考
因为我做的是把java文件里的方法切分开,每一个方法视为一个样本,content的部分就是方法的代码。由于方法里面有各种字符,如引号,直接写入csv会出现错位、串行、串列的问题。于是我在mycsv里面加了一个CSVFormatter,这块代码主要参考了下面这篇博客。
Java处理CSV文件中的换行符等字符_pzzhao的博客-优快云博客_csv 换行符https://blog.youkuaiyun.com/pzzhao/article/details/124648512另外其实很多关于java csv文件错位的博客内容都比较差,讲不清楚也就算了,甚至还提供了错误的代码,浪费了我很多时间,所以我写这篇博客帮大家踩坑。