最近要用java制作一个数据集,每一行是一个样本,格式是csv。用了一下java类的相关概念,把csv文件里的每一行,即每一个样本视为一个类。
目前已有的csv包如opencsv,可以支持字符串,也可以支持javabean(即java类)。相关教程如下
Java OpenCSV|极客教程 (geek-docs.com)https://geek-docs.com/java/java-tutorial/java-opencsv.html由于墙的原因,我maven老是下载不到opencsv的jar包,没办法我只能手写个平民版的
自定义的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
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
methods = new ArrayList<>(); - /*
- 一些操作将数据写入methods中
- */
- String header[] = {"FilePath", "MethodName", "Content"};
- mycsv m = new mycsv("a.csv");
- m.writeCSVFile(header, methods);
- }
因为我做的是把java文件里的方法切分开,每一个方法视为一个样本,content的部分就是方法的代码。由于方法里面有各种字符,如引号,直接写入csv会出现错位、串行、串列的问题。于是我在mycsv里面加了一个CSVFormatter,这块代码主要参考了下面这篇博客。
Java处理CSV文件中的换行符等字符_pzzhao的博客-CSDN博客_csv 换行符https://blog.csdn.net/pzzhao/article/details/124648512另外其实很多关于java csv文件错位的博客内容都比较差,讲不清楚也就算了,甚至还提供了错误的代码,浪费了我很多时间,所以我写这篇博客帮大家踩坑。