`

CSV类库:OpenCSV

    博客分类:
  • csv
 
阅读更多

一: CSV简介

Comma-Separated Values(CSV), 因分隔符没有严格指定规范标准,可以使用逗号,也可以使用其他字符(如制表符\t、分号;等),所以CSV也称为 逗号分隔值或者字符分隔值。csv文件是使用纯文本来存储表格数据(即只能存储文本,不能存储二进制数据)。CSV因没有严格的规范,所以变异的形式比较多。

二: CSV文件的组成和规则

组成:

csv文件由任意条数据的【记录】组成, 每条记录的最后一个字段也要使用分隔符,记录间一般使用换行符分隔\n,也可以指定其他字符串(比如”——”)
每条记录由【字段】组成,字段间使用分隔符(逗号、制表符\t等)分隔。


规则:

  • 开头是不留空,以行为单位。
  • 可含或不含列名,含列名则居文件第一行。
  • 一行数据不跨行,无空行。
  • 以半角逗号(即,)作分隔符,列为空也要表达其存在。
  • 列内容如存在半角引号(即”),替换成半角双引号(”“)转义,即用半角引号(即”“)将该字段值包含起来。
  • 文件读写时引号,逗号操作规则互逆。
  • 内码格式不限,可为 ASCII、Unicode 或者其他。
  • 不支持特殊字符
  • 如果值有特殊字符(逗号,双引号,换行符等)要使用引号(一般使用双引号,也可以指定单引号)括起来,比如分隔符是逗号,值中也出现逗号了
  • 值中出现双引号,需要使用双引号来转义


三: CSV和Excel的区别

.csv文件可以被excel软件打开,csv只能用于存储纯文本内容,excel不仅支持纯文本内容还支持二进制数据,可以看做csv是excel的轻量级简单版的实现,excel比csv更加强大,csv文件一般用于表格数据的传输。

四:类库简介opencsv

官网:http://opencsv.sourceforge.net/
maven:https://mvnrepository.com/artifact/com.opencsv/opencsv 


支持注解(根据名称或者位置)
支持自定义转换器AbstractBeanField
支持跳跃行skipLine和数据过滤Filter

注解:

@CsvBindByName:根据CSV输入中该字段的标题名,将一个bean字段映射到CSV文件中的一个字段, 可以控制列名,按名字列名的先后顺序好像是按照字母排序的
@CsvBindByPosition:根据CSV输入中字段的数字位置,将一个bean字段映射到CSV文件中的一个字段@CsvBindByPosition(position = 0) 按位置好像不能写列名,但是可以控制列的顺序, 还不知道即可控制列名,又可以控制列的顺序的方法(通过String[]控制应该是最灵活的)
@CsvCustomBindByName:与CsvBindByName相同,但必须提供自己的数据转换类。
@CsvCustomBindByPosition:与CsvBindByPosition相同,但必须提供自己的数据转换类。
@CsvDate:必须应用于日期/时间类型的bean字段,以便自动转换工作,并且必须与前述四个注释中的一个一起使用。


API

CSVWriter
        public CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd);
        public void writeAll(List allLines);
        public void writeNext(String[] nextLine);
        protected void writeColumnNames(ResultSet rs);
        public void flush();
        public void close();

CSVReader
        public CSVReader(Reader reader, char separator, char quotechar, char escape, int line, boolean strictQuotes, boolean ignoreLeadingWhiteSpace);
        public String[] readNext();
        public List readAll();
        public void close();

Strategy
    ColumnPositionMappingStrategy
    HeaderColumnNameMappingStrategy
    HeaderColumnNameTranslateMappingStrategy

 


自定义的符号:

char separator: 分隔符, 默认使用逗号
char quotechar: 引号字符,双引号或者单引号,默认双引号,每个值都使用指定的引号包围起来,即使数据类型是int类型也会用引号引起来
char escapechar:转义字符, 默认是双引号
String lineEnd:行结束符,默认\n 或者 \r\n


五:基本使用

方式一:使用String[]方式

// CSVWriter 写
@Test
public void testWriteByStringArray() throws Exception{
    OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("D:\\test.csv"), Charset.forName("UTF-8"));
    CSVWriter csvWriter = new CSVWriter(out, ',');

    String[] record0 = {"id", "name", "age", "birthday"};
    csvWriter.writeNext(record0);

    String[] record1 = {"1", "张三", "20", "1990-08-08"};
    String[] record2 = {"2", "lisi", "21", "1991-08-08"};
    String[] record3 = {"3", "wangwu", "22", "1992-08-08"};
    List<String[]> allLines = new ArrayList<String[]>();
    allLines.add(record1);
    allLines.add(record2);
    allLines.add(record3);
    csvWriter.writeAll(allLines);
    csvWriter.close();
}

 


 

// CSVReader 读
@Test
public void testRead() throws Exception{
   InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\test.csv"), Charset.forName("UTF-8"));
   CSVReader reader = new CSVReader(in, ',');
   List<String[]> allRecords = reader.readAll();
   for (String[] records : allRecords) {
       for (String filed : records) {
           System.out.print(filed + " ");
       }
       System.out.println();
   }
   reader.close();
}

 

 


方式二:使用注解Bean方式

package com.mengday.csv;

import com.opencsv.bean.*;

import com.opencsv.bean.customconverter.ConvertSplitOnWhitespace;

import java.util.Date;
import java.util.List;


public class User {
    @CsvBindByName(required = true)
    private Long id;

    @CsvBindByName(column = "User Name")
    private String name;

    private int age;

    @CsvBindByName
    @CsvDate("yyyy-MM-dd hh:mm:ss")
    private Date birthday;

    @CsvCustomBindByName(converter = ConvertSplitOnWhitespace.class)
    private List<String> tags;

    @CsvBindByName
    private boolean vip;


    public User(){

    }

    public User(Long id, String name, int age, Date birthday, List<String> tags, boolean vip) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
        this.tags = tags;
        this.vip = vip;
    }

    // Getter && Setter && toString()
}

 

@Test
 public void testCSVWriteByAnnotation() throws Exception{
     List<User> users = new ArrayList<User>();
     users.add(new User(1L, "张'三'", 20, new Date(), Arrays.asList("eat", "drink", "girl"), true));
     users.add(new User(2L, "李,四", 21, new Date(), Arrays.asList("mm", "money"), false));
     users.add(new User(3L, "王\n五", 22, new Date(), Arrays.asList("girl", "$"), true));

     OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("D:\\test.csv"), Charset.forName("UTF-8"));
     StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).withSeparator('\t').withQuotechar('\'').build();

     beanToCsv.write(users);
     writer.close();
 }

 

 

@Test
public void testCSVReadByAnnotation() throws Exception{
    InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\test.csv"), Charset.forName("UTF-8"));
    HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy();
    strategy.setType(User.class);

    CsvToBean csvToBean = new CsvToBeanBuilder<User>(in).withSeparator('\t').withQuoteChar('\'').withMappingStrategy(strategy).build();
    List<User> users = csvToBean.parse();
    for(User user: users) {
        System.out.println(user);
    }
}

 

 

 

 

 

  • 大小: 9 KB
  • 大小: 15.3 KB
  • 大小: 13.6 KB
  • 大小: 18.2 KB
分享到:
评论

相关推荐

    Csv读取代码自动生成工具

    2. **生成适配器代码**:根据CSV文件的分析结果,工具能够生成相应的读取代码,可能包括使用各种编程语言(如Python的pandas库,Java的OpenCSV库,C#的System.IO.File类等)来逐行读取和处理数据。 3. **数据验证**...

    JobApplication_WarrickshireAnalytics:CSV解析应用

    1. **使用内置类库**:Java标准库并不直接支持CSV解析,但可以通过`BufferedReader`和`Scanner`类进行基础的分隔符解析。开发者需要自己编写代码来处理行与列的边界。 2. **使用第三方库**:鉴于Java标准库的不足,...

    几个jar工具包

    在IT行业中,jar(Java Archive)文件是一种广泛使用的格式,用于打包Java类库,以便在Java平台上运行。这里我们关注的是一组特定的jar工具包,包括pinyin4j.jar、opencsv.jar、emoji.jar、json.jar和jaxen.jar。...

    CSV文件读写下载包

    OpenCSV是一个简单的用于解析CSV文件的java类库,它封装了CSV格式文件的输出和读入,可以自动处理CSV格式中的特殊字符,最重要的是OpenCSV可以用于商业化(commercial-friendly)。具体的使用方法:CSVReader reader = new...

    CsvToJson:将csv转换为json的Java脚本

    在Java中,可以利用诸如OpenCSV、Apache Commons CSV或Java 8内置的`java.nio.file.Files`和`java.util.Scanner`等库来读取CSV文件,然后使用Jackson、Gson或其他JSON库将数据模型序列化为JSON。 描述中提到的"转换...

    CsvUtil_java_

    在实际项目中,还可以使用现成的CSV处理库,如Apache Commons CSV、OpenCSV或uniVocity-csv等,它们提供了更丰富的功能和更好的性能,但自定义实现可以帮助理解CSV处理的基本原理,并在特定需求下进行定制。...

    utilities:实用程序代码片段,即从 csv 文件的指定列创建列表

    在Java中,可以使用内置的`java.io`类库或第三方库如Apache Commons CSV、OpenCSV或Java 8以后的`java.util.stream.Stream`配合`BufferedReader`来实现。这些库提供了API来解析CSV文件,将每一行拆分成单独的字段。 ...

    java_test..,/1---//17

    2. **CSV处理**:在Java中,可以使用开源库如Apache Commons CSV或OpenCSV来读写CSV文件。structrue_at.csv的处理可能涉及到这些库的使用,展示如何将CSV数据导入到Java程序中进行分析或处理。 3. **编程基础**:...

    cs源码java-JavaHW13-CsvFileSource:JavaHW13-CsvFileSource

    这个项目很可能是一个Java类库或应用,其目标是提供一个方便、高效的方式来读取和操作CSV文件。 【描述】"cs源码java" 指出这是一个与计算机科学(Computer Science, cs)相关的Java代码。这暗示我们可能正在处理一...

    java_test2

    2. CSV文件处理:使用Java的内置库如OpenCSV或Apache Commons CSV来读取和写入结构化数据。 3. XML处理:理解DOM、SAX和StAX解析器,以及如何在Java中使用它们来解析和操作XML文档。 4. IDE集成:使用Visual Studio ...

    某公司的java考试题目

    此外,如果需要处理CSV格式的数据,Java的逗号分隔值处理库(如OpenCSV)会派上用场。 对于Java新手,建议首先学习并掌握基础语法,然后逐步深入到面向对象编程概念,理解类、对象、封装、继承和多态。同时,熟悉...

    关于Excel导入导出的jar包.rar

    6. **其他工具**:除了上述库外,还有其他工具和框架,如OpenCSV、JasperReports等,它们提供Excel处理功能,但可能更专注于特定领域,如CSV文件处理或报表生成。 总的来说,"关于Excel导入导出的jar包.rar" 提供的...

    another_orders_parser

    在Java中,可以使用`java.util.CSVFormat`和`java.util.CSVParser`类(来自`com.opencsv`库)来解析CSV文件。这些类提供了读取、解析和操作CSV数据的功能。 4. JSON(JavaScript Object Notation)文件解析: JSON...

    学生信息管理系统

    对于CSV(逗号分隔值)格式的文件,Java还可以利用opencsv库方便地进行导入和导出。 4. **系统架构** 一个典型的学生信息管理系统可能包括以下模块:用户登录验证、学生信息管理、课程管理、成绩录入、报表生成等...

    universal-converter

    9. CSV/Excel转换:对于处理表格数据,Java有如Apache POI库可以用于读写Excel文件,OpenCSV用于处理CSV文件。 10. 数据流转换:Java 8引入的Stream API提供了一种处理集合数据的新方式,可以方便地进行数据转换和...

    ScoutFormatter

    例如,使用OpenCSV库解析CSV数据,使用Jackson或Gson库处理JSON,以及使用JAXB或DOM处理XML。这些库使得读取、解析和转换数据变得简单高效。 2. **数据格式化**:为了使数据更易读和理解,ScoutFormatter可能包含了...

    Machine_Learning_App

    Java中可以使用Apache Commons Math库进行基础的数学运算,或者使用OpenCSV、Apache POI处理CSV或Excel数据。 2. 模型选择与训练:项目可能包含了多种经典的机器学习模型,如线性回归、逻辑回归、决策树、随机森林...

    代码来临2020

    Java的File、Scanner和BufferedReader类提供了方便的文件操作方法,可以用来读取输入数据,而JSON或CSV解析库(如Jackson或OpenCSV)则可以帮助我们解析复杂格式的数据。 在调试和测试阶段,JUnit是Java开发者常用...

Global site tag (gtag.js) - Google Analytics