java解析csv文件内容

Java解析CSV文件

CSV规则

  • 1、以半角逗号(,)作分隔符。
  • 2、单元格中的内容包含半角引号("),需要使用半角双引号("")转义。即单元格中的内容的所有(")使用("")替换。
  • 3、单元格中的内容包含换行符或者包含半角逗号(,),整个单元格的值需要用双引号("")包起来。

一般都是数据库导出为CSV文件,然后在其他地方,进行数据传输

测试实体类

    @Data @AllArgsConstructor @NoArgsConstructor public class Student { private Integer id; private String name; private Integer age; }

方案一(推荐)

使用第三方jar,方便快捷

Maven

    <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>4.4</version> </dependency>

使用方式:

    @Test public void readCSV() { String srcPath = "C:\\Users\\Administrator\\Desktop\\t_student.csv"; String charset = "utf-8"; try (CSVReader csvReader = new CSVReaderBuilder(new BufferedReader(new InputStreamReader(new FileInputStream(new File(srcPath)), charset))).build()) { Iterator<String[]> iterator = csvReader.iterator(); iterator.next(); //跳过表头 //创建一个集合用于存储csv文件读取出来的所有数据 List<Student> students=new ArrayList<>(); while (iterator.hasNext()) { String[] next = iterator.next();//获取每一行的数据 Student student=new Student(); student.setId(Integer.parseInt(openCsvDefault(next[0],"0"))); student.setName(openCsvDefault(next[1],"")); student.setAge(Integer.parseInt(openCsvDefault(next[2],"0"))); students.add(student); } System.out.println(students); } catch (Exception e) { e.printStackTrace(); } } // 为空补默认值 public String openCsvDefault(String str,String m){ if (Strings.isBlank(str)) { return m; } else { return str; } }

方案二(正则表达式)

手动写代码进行读取的csv数据默认是用双引号包起来的,在最后的截取中,如果只按照双引号外的逗号截取,不就是能得到想要的数据了。我们使用正则表达式进行手动截取

    @Test public void show(){ long startTime = System.currentTimeMillis(); try ( BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\t_student.csv")))); ) { //跳过标题 final int size = br.readLine().split(",").length; //切割数据 //创建一个集合用于存储csv文件读取出来的所有数据 List<Student> students=new ArrayList<>(); //开始读取 String line; do { line = br.readLine(); //每次读取一行数据 if (!Strings.isBlank(line)) { String[] strings=new String[size];//保证每一列都是一样的长度 //正则表达式切割,避免中文内包含逗号 String split[] = line.trim().split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)",-1); for (int i = 0; i < strings.length; i++) { if (i>=split.length){ break; } strings[i]=split[i]; } System.out.println(Arrays.toString(strings)); Student student=new Student(); student.setId(Integer.parseInt( csvStrDefault(strings[0],"0" ))); student.setName(csvStrDefault(strings[1],"")); student.setAge(Integer.parseInt(csvStrDefault(strings[2],"0"))); students.add(student); } }while (line != null); System.out.println(students); } catch (Exception e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("花费时间为:" + (double)(endTime - startTime)/1000+"秒"); } // 为空补默认值 public String csvStrDefault(String str,String m){ if (Strings.isBlank(str)) { return m; } else { return str.substring(1,str.length()-1); } }

点赞 -收藏-关注-便于以后复习和收到最新内容

有其他问题在评论区讨论-或者私信我-收到会在第一时间回复

如有侵权,请私信联系我

感谢,配合,希望我的努力对你有帮助^_^