iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java中csv文件读写分析
  • 196
分享到

Java中csv文件读写分析

javaopencv 2023-09-09 12:09:37 196人浏览 安东尼
摘要

文章目录 一、txt、csv、tsv文件二、csv文件规范三、csv使用场景四、Java中的csv类库1. javacsv2. opencsv写入器读取器解析器注解映射策略MappingStr

文章目录


一、txt、csv、tsv文件

txt、csv、tsv都属于文本文件

文件类型英文全称名称分隔符描述
txttext文本类型没有明确要求可以有分隔符,也可以没有
csvComma-separated values逗号分隔值类型半角逗号:','csv是txt的特殊类型
tsvTab-separated values制表符分隔值制表符:'\t'tsv是txt的特殊类型

csv又有叫做Char-separated values(字符分隔值类型),通过字符值进行分隔。

但因为半角逗号在数据中出现的的可能性比较大,所以经常会使用文本包装符来标识逗号为数据中的一部分,或者直接使用其它特殊符号作为分隔符。

二、csv文件规范

  1. 每一行记录位于一个单独的行上,用回车换行符CRLF(\r\n)分割。
  2. 文件中的最后一行记录可以有结尾回车换行符,也可以没有。
  3. 第一行可以存在一个可选的标题头,格式和普通记录行的格式一样。标题头要包含文件记录字段对应的名称,应该有和记录字段一样的数量。
  4. 在标题头行和普通行每行记录中,会存在一个或多个由半角逗号(,)分隔的字段。整个文件中每行应包含相同数量的字段,空格也是字段的一部分,不应被忽略。每一行记录最后一个字段后不能跟逗号。(通常用逗号分隔,也有其他字符分隔的CSV,需事先约定)
  5. 每个字段可用也可不用半角双引号(")(文本包装符)括起来(如Microsoft的excel就根本不用双引号)。如果字段没有用引号括起来,那么该字段内部不能出现双引号字符。
  6. 字段中若包含回车换行符、双引号或者逗号,该字段需要用双引号括起来。
  7. 如果用双引号括字段,那么出现在字段内的双引号前必须再加一个双引号进行转义。

三、csv使用场景

csv文件经常用于导出大批量数据(csv比excel更轻量级,更适合大批量数据)。

csv与excel对比:

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

四、Java中的csv类库

java中的csv的类库主要有以下几类:

  • javacsv:javacsv在2014-12-10就不维护了
  • opencsv:opencsv是apache的项目,至今仍在维护

1. javacsv

2. opencsv

opencsv是一个用Java来分析和生成csv文件的框架。通常用来bean的写入csv文件和从csv文件读出bean,并支持注解的方式。

maven依赖:

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

写入器

名称描述
CSVWriter简单的CSV写入器
CSVParserWriter通过CSVParser解析数据的写入器
StatefulBeanToCsv直接将bean写入CSV的写入器

读取器

名称描述
CSVReader简单的CSV读取器
CsvToBeanCSV读取为bean的读取器
CSVReaderHeaderAware

解析器

名称描述
CSVParser简单的CSV解析器
RFC4180Parser基于RFC4180规范的解析器

注解

注解描述主要属性
@CsvBindByName按表头名称绑定required:必须字段,默认为false.该字段为空抛异常
column:对象列标题名称
@CsvBindByPosition按位置绑定required:必须字段,默认为false.该字段为空抛异常
position:位置索引
@CsvCustomBindByName与CsvBindByName相同,但必须提供自己的数据转换类required:必须字段,默认为false.该字段为空抛异常
column:对象列标题名称
converter:转换器
@CsvCustomBindByPosition与CsvBindByPosition相同,但必须提供自己的数据转换类required:必须字段,默认为false.该字段为空抛异常
column:对象列标题名称
converter:转换器
@CsvBindAndJoinByName应用于MultiValuedMap集合类型的bean字段,通过标题名称绑定required:必须字段,默认为false.该字段为空抛异常
column:对象列标题名称
converter:转换器
mapType:集合类型
elementTyp:元素类型
@CsvBindAndJoinByPosition应用于MultiValuedMap集合类型的bean字段,通过位置索引绑定required:必须字段,默认为false.该字段为空抛异常
position:位置索引
converter:转换器
mapType:集合类型
elementTyp:元素类型
@CsvBindAndSplitByName应用于Collection集合类型的bean字段,通过标题名称绑定required:必须字段,默认为false.该字段为空抛异常
column:对象列标题名称
converter:转换器
mapType:集合类型
elementTyp:元素类型
splitOn:
@CsvBindAndSplitByPosition应用于Collection集合类型的bean字段,通过位置索引绑定required:必须字段,默认为false.该字段为空抛异常
position:位置索引
converter:转换器
mapType:集合类型
elementTyp:元素类型
splitOn:
@CsvDate应用于日期/时间类型的bean字段,与上面相关的绑定注解结合使用value:日期格式,例如:yyyy-MM-dd
@CsvNumber应用于数字类型的bean字段,与上面相关的绑定注解结合使用value:数字格式,例如:000.###

映射策略

MappingStrategy接口

public interface MappingStrategy<T> {    void captureHeader(CSVReader var1) throws IOException, CsvRequiredFieldEmptyException;    String[] generateHeader(T var1) throws CsvRequiredFieldEmptyException;        @Deprecated    default boolean isAnnotationDriven() {        return false;    }    T populateNewBean(String[] var1) throws CsvBeanIntrospectionException, CsvFieldAssignmentException, CsvChainedException;    default void setErrorLocale(Locale errorLocale) {    }    void setType(Class<? extends T> var1) throws CsvBadConverterException;    default void setProfile(String profile) {        throw new UnsupportedOperationException();    }    default void ignoreFields(MultiValuedMap<Class<?>, Field> fields) throws IllegalArgumentException {        throw new UnsupportedOperationException();    }    String[] transmuteBean(T var1) throws CsvFieldAssignmentException, CsvChainedException;}
方法返回值方法描述
voidcaptureHeader(CSVReader reader)该方法用于处理CSV文件的头部,即第一行,可以从CSVReader中读取头部信息,并进行处理。

方法用于捕获CSV文件的列头信息,以便在读取CSV文件时使用。在执行该方法时,CSVReader会从文件中读取第一行数据,并解析为列头列表,然后将列表作为参数传递给captureHeader()方法。接下来,在MappingStrategy实现中,可以使用列头信息来指定CSV文件中各列的名称和位置等信息。
String[]generateHeader(T bean)该方法用于生成CSV文件的头部信息,通过传入一个泛型对象T,可以从对象中获取属性信息,生成CSV文件的头部。
TpopulateNewBean(String[] line)该方法用于将CSV文件中读取到的一行数据转换为一个泛型对象T。参数var1即为一行CSV数据。在转换过程中可能会出现异常,如属性与值类型不匹配等,需要进行异常处理。
voidsetErrorLocale(Locale errorLocale)该方法用于设置错误信息的本地化信息,但默认实现中并没有进行具体的处理。
voidsetType(Class type)该方法用于设置要转换的实体类类型,即泛型T的具体类型。如果类型不匹配或不存在相应的转换器,会抛出CsvBadConverterException异常。
voidsetProfile(String profile)该方法默认不实现,抛出不支持的操作异常。
voidignoreFields(MultiValuedMap, Field> fields)该方法用于忽略某些属性,使其不参与CSV文件的读取或写入操作。该方法默认不实现,抛出不支持的操作异常。
String[]transmuteBean(T bean)该方法用于将单个实体类对象转换为CSV文件中的一行数据。参数var1即为要转换的对象。在转换过程中可能会出现异常,如属性值为空等,需要进行异常处理。

MappingStrategy的实现类

在这里插入图片描述

名称描述重要方法方法描述
ColumnPositionMappingStrategy列位置映射策略,用于没有头文件(标题行)的文件setColumnMapping(String… columnMapping设置要映射的列名集合,集合下标即为列写入顺序
HeaderColumnNameMappingStrategy标题列名称映射策略,setColumnOrderOnWrite(Comparator writeOrder)通过比较器,设置列写入顺序
HeaderColumnNameTranslateMappingStrategy标题列名称翻译映射策略
bean的属性名可以与csv列头不一样,通过指定map来映射。
setColumnMapping(Map columnMapping)设置标题名与列名的映射
FuzzyMappingStrategy

① ColumnPositionMappingStrategy

使用该映射策略需要csv文件没有标题行。该策略通过设置列的下标位置来指定列的顺序,有两种方式来设置列的下标:

  • 通过CsvBindByPosition、CsvCustomBindByPosition、CsvBindAndJoinByPosition、CsvBindAndSplitByPosition注解来设置列的下标
  • 通过setColumnMapping(String… columnMapping)方法来设置列的下标

② HeaderColumnNameMappingStrategy

该映射策略用于有标题行的csv文件。该策略通过指定比较器来指定列的顺序:

  • 通过setColumnOrderOnWrite(Comparator writeOrder)指定比较器

关于标题列的名称:

  • 默认使用bean的字段名称大写作为标题列的名称
  • 如果使用CsvBindByName、CsvCustomBindByName、CsvBindAndJoinByName、CsvBindAndSplitByName注解的column属性指定列名称,则使用该值,否则使用bean的字段名称大写作为标题列的名称

③ HeaderColumnNameTranslateMappingStrategy

该映射策略用于有标题行的csv文件。该策略通过映射Map来指定标题列名与bean的属性名映射关系。

映射Map的key=标题列名,value=bean的属性名。

需要注意:

  • 该映射策略只适用于读取csv文件时,指定标题列名与bean的属性名的映射关系
  • 该映射策略不适用于写入csv文件时,指定bean的属性名与标题列名的映射关系(不要误解)

过滤器

名称描述
CsvToBeanFilter读取时根据过滤规则过滤掉一些行

主要方法:boolean allowLine(String[] line)

  • 入参中的line表示一行数据的集合
  • 返回值为false的这行数据被将被过滤掉

构建器

名称描述
CSVWriterBuilderCSV写入构建器,构建CSVWriter或CSVParserWriter
StatefulBeanToCsvBuilder对象写入CSV构建器,构建StatefulBeanToCsv
CSVReaderBuilderCSV读取构建器,构建CSVReader
CsvToBeanBuilderCSV读取对象构建器,构建CsvToBean
CSVReaderHeaderAwareBuilder构建CSVReaderHeaderAware
CSVParserBuilderCSV解析器构造器,构建CSVParser
RFC4180ParserBuilderRFC4180解析器构造器,构建RFC4180Parser

写入方式

User类:

@Data@NoArgsConstructor@AllArgsConstructorpublic class User {    public String userId;    public String userName;    public String sex;}

User1类:

@Data@NoArgsConstructor@AllArgsConstructorpublic class User1 {    @CsvBindByPosition(position = 0)    public String userId;    @CsvBindByPosition(position = 1)    public String userName;    @CsvBindByPosition(position = 2)    public String sex;}

User2类:

@Data@NoArgsConstructor@AllArgsConstructorpublic class User2 {    @CsvBindByName(column = "用户ID")    public String userId;    @CsvBindByName(column = "用户名")    public String userName;    @CsvBindByName(column = "性别")    public String sex;}

① 简单的写入

CSVWriter的主要参数:

  • Writer writer:指定需要写入的源文件

  • char separator:分隔符(默认逗号)

  • char quotechar:文本边界符(默认双引号)

    如果数据中包含分隔符,需要使用文本边界符包裹数据。通常用双引号、单引号或斜杠作为文本边界符

  • char escapechar:转义字符(默认双引号)

  • String lineend:行分隔符(默认为\n)

使用方法:

        private static void csvWriter() throws Exception {        // 写入位置        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        // 标题行        String[] titleRow = {"用户ID", "用户名", "性别"};        // 数据行        ArrayList<String[]> dataRows = new ArrayList<>();        String[] dataRow1 = {"1", "张三", "男"};        String[] dataRow2 = {"2", "李四", "男"};        String[] dataRow3 = {"3", "翠花", "女"};        dataRows.add(dataRow1);        dataRows.add(dataRow2);        dataRows.add(dataRow3);        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), Charset.forName("UTF-8"));        // 1. 通过new CSVWriter对象的方式直接创建CSVWriter对象        // CSVWriter csvWriter = new CSVWriter(writer);        // 2. 通过CSVWriterBuilder构造器构建CSVWriter对象        CSVWriter csvWriter = (CSVWriter) new CSVWriterBuilder(writer)                .build();        // 写入标题行        csvWriter.writeNext(titleRow, false);        // 写入数据行        csvWriter.writeAll(dataRows, false);        csvWriter.close();    }

demo.csv内容:

用户ID,用户名,性别1,张三,男2,李四,男3,翠花,女

② 基于位置映射的写入

使用方法:

        private static void beanToCsvByPosition() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        List<User> list = new ArrayList<>();        list.add(new User("1", "张三", "男"));        list.add(new User("2", "李四", "男"));        list.add(new User("3", "翠花", "女"));        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), Charset.forName("UTF-8"));        ColumnPositionMappingStrategy<User> strategy = new ColumnPositionMappingStrategy();        // 未指定的列不写入        String[] columns = new String[] { "userId", "userName", "sex"};        strategy.setColumnMapping(columns);        strategy.setType(User.class);        // 如果需要标题行,可这样写入        // CSVWriter csvWriter = (CSVWriter) new CSVWriterBuilder(writer)        //         .build();        // String[] titleRow = {"用户ID", "用户名", "性别"};        // csvWriter.writeNext(titleRow, false);        StatefulBeanToCsv<User> statefulBeanToCsv = new StatefulBeanToCsvBuilder<User>(writer)                .withMappingStrategy(strategy)                .withApplyQuotesToAll(false)                .build();        statefulBeanToCsv.write(list);        writer.close();    }

demo.csv内容:

1,张三,男2,李四,男3,翠花,女

③ 基于CsvBindByPosition注解映射的写入

使用方法:

        private static void beanToCsvByPositionAnnotation() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        List<User1> list = new ArrayList<>();        list.add(new User1("1", "张三", "男"));        list.add(new User1("2", "李四", "男"));        list.add(new User1("3", "翠花", "女"));        // 未使用@CsvBindByPosition注解的列不写入        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), Charset.forName("UTF-8"));        // 如果需要标题行,可这样写入        // CSVWriter csvWriter = (CSVWriter) new CSVWriterBuilder(writer)        //         .build();        // String[] titleRow = {"用户ID", "用户名", "性别"};        // csvWriter.writeNext(titleRow, false);        StatefulBeanToCsv<User1> statefulBeanToCsv = new StatefulBeanToCsvBuilder<User1>(writer)                .withApplyQuotesToAll(false)                .build();        statefulBeanToCsv.write(list);        writer.close();    }

demo.csv内容:

1,张三,男2,李四,男3,翠花,女

④ 基于列名映射的写入

使用方法:

        private static void beanToCsvByName() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        List<User> list = new ArrayList<>();        list.add(new User("1", "张三", "男"));        list.add(new User("2", "李四", "男"));        list.add(new User("3", "翠花", "女"));        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), Charset.forName("UTF-8"));        // 可通过比较器指定列的顺序        // 标题行的列名默认为bean的字段名大写        HeaderColumnNameMappingStrategy<User> strategy = new HeaderColumnNameMappingStrategy<>();        HashMap<String, Integer> columnOrderMap = new HashMap<>();        columnOrderMap.put("USERID", 1);        columnOrderMap.put("SEX", 10);        columnOrderMap.put("USERNAME", 100);        strategy.setColumnOrderOnWrite(Comparator.comparingInt(column -> (columnOrderMap.getOrDefault(column, 0))));        strategy.setType(User.class);        StatefulBeanToCsv<User> statefulBeanToCsv = new StatefulBeanToCsvBuilder<User>(writer)                .withMappingStrategy(strategy)                .withApplyQuotesToAll(false)                .build();        statefulBeanToCsv.write(list);        writer.close();    }

demo.csv内容:

USERID,SEX,USERNAME1,男,张三2,男,李四3,女,翠花

⑤ 基于CsvBindByName注解映射的写入

使用方法:

        private static void beanToCsvByNameAnnotation() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        List<User2> list = new ArrayList<>();        list.add(new User2("1", "张三", "男"));        list.add(new User2("2", "李四", "男"));        list.add(new User2("3", "翠花", "女"));        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), Charset.forName("UTF-8"));        // 可通过比较器指定列的顺序        // 通过CsvBindByName注解的column属性,指定标题行的列名        HeaderColumnNameMappingStrategy<User2> strategy = new HeaderColumnNameMappingStrategy<>();        // 注意这里的key是指的标题行的列名        HashMap<String, Integer> columnOrderMap = new HashMap<>();        columnOrderMap.put("用户ID", 1);        columnOrderMap.put("用户名", 10);        columnOrderMap.put("性别", 100);        strategy.setColumnOrderOnWrite(Comparator.comparingInt(column -> (columnOrderMap.getOrDefault(column, 0))));        strategy.setType(User2.class);        StatefulBeanToCsv<User2> statefulBeanToCsv = new StatefulBeanToCsvBuilder<User2>(writer)                .withMappingStrategy(strategy)                .withApplyQuotesToAll(false)                .build();        statefulBeanToCsv.write(list);        writer.close();    }

demo.csv内容:

用户ID,用户名,性别1,张三,男2,李四,男3,翠花,女

读取方式

通过简单的写入写入的数据

① 简单的读取

使用方法:

        private static void csvReader() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"));        CSVReader csvReader = new CSVReaderBuilder(reader).build();        List<String[]> list = csvReader.readAll();        for (String[] strings : list) {            System.out.println(JSON.tojsONString(strings));        }        csvReader.close();    }

控制台日志

["用户ID","用户名","性别"]["1","张三","男"]["2","李四","男"]["3","翠花","女"]

② 基于位置映射的读取

通过基于位置映射的写入写入的数据

使用方法:

        private static void csvToBeanByPosition() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"));        // 不需要标题行,列的顺序通过列位置映射指定        ColumnPositionMappingStrategy<User> strategy = new ColumnPositionMappingStrategy();        String[] columns = new String[] { "userId", "userName", "sex"};        strategy.setColumnMapping(columns);        strategy.setType(User.class);        CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader)                .withMappingStrategy(strategy)                .build();        List<User> list = csvToBean.parse();        for (User user : list) {            System.out.println(JSON.toJSONString(user));        }        reader.close();    }

控制台日志:

{"sex":"男","userId":"1","userName":"张三"}{"sex":"男","userId":"2","userName":"李四"}{"sex":"女","userId":"3","userName":"翠花"}

③ 基于CsvBindByPosition注解映射的读取

通过基于CsvBindByPosition注解映射的写入写入的数据

使用方法:

        private static void csvToBeanByPositionAnnotation() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"));        // 不需要标题行,列的顺序通过CsvBindByPosition注解的position属性指定        CsvToBean<User1> csvToBean = new CsvToBeanBuilder<User1>(reader)                .withType(User1.class)                .build();        List<User1> list = csvToBean.parse();        for (User1 user : list) {            System.out.println(JSON.toJSONString(user));        }        reader.close();    }

控制台日志:

{"sex":"男","userId":"1","userName":"张三"}{"sex":"男","userId":"2","userName":"李四"}{"sex":"女","userId":"3","userName":"翠花"}

④ 基于列名映射的读取

通过基于列名映射的写入写入的数据

使用方法:

        private static void csvToBeanByName() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"));        // bean的字段名称大写为标题列名        CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader)                .withType(User.class)                .build();        List<User> list = csvToBean.parse();        for (User user : list) {            System.out.println(JSON.toJSONString(user));        }        reader.close();    }

控制台日志:

{"sex":"男","userId":"1","userName":"张三"}{"sex":"男","userId":"2","userName":"李四"}{"sex":"女","userId":"3","userName":"翠花"}

⑤ 基于CsvBindByName注解映射的读取

通过基于CsvBindByName注解映射的写入写入的数据

使用方法:

    private static void csvToBeanByNameAnnotation() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"));        // CsvBindByName注解的column属性为标题列名        CsvToBean<User2> csvToBean = new CsvToBeanBuilder<User2>(reader)                .withType(User2.class)                .build();        List<User2> list = csvToBean.parse();        for (User2 user : list) {            System.out.println(JSON.toJSONString(user));        }        reader.close();    }

控制台日志:

{"sex":"男","userId":"1","userName":"张三"}{"sex":"男","userId":"2","userName":"李四"}{"sex":"女","userId":"3","userName":"翠花"}

⑥ 基于列名转换映射的读取

通过基于CsvBindByName注解映射的读取写入的数据

使用方法:

public class MyCsvToBeanFilter implements CsvToBeanFilter {    @Override    public boolean allowLine(String[] line) {        // 过滤掉用户名为李四的行        if("李四".equals(line[1])){            return false;        }        return true;    }}
        private static void csvToBeanByColumnNameTranslateMapping() throws Exception {        String classpath = Thread.currentThread().getContextClassLoader().getResource("").getPath();        String fileName = classpath+"test/demo.csv";        InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"));        // 指定标题列名和bean列名映射关系        HeaderColumnNameTranslateMappingStrategy<User> strategy = new HeaderColumnNameTranslateMappingStrategy<>();        // key:标题列名,value:bean的属性名        HashMap<String, String> columnMappingMap = new HashMap<>();        columnMappingMap.put("用户ID", "userId");        columnMappingMap.put("性别", "sex");        columnMappingMap.put("用户名", "userName");        strategy.setColumnMapping(columnMappingMap);        strategy.setType(User.class);        CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader)                .withMappingStrategy(strategy)                .withFilter(new MyCsvToBeanFilter())                .withIgnoreField(User2.class, User2.class.getField("userId"))// 忽略userId属性                .build();        List<User> list = csvToBean.parse();        for (User user : list) {            System.out.println(JSON.toJSONString(user));        }        reader.close();    }

控制台日志:

{"sex":"男","userName":"张三"}{"sex":"女","userName":"翠花"}

自定义列表和列顺序

3. commons-csv

4. hutool CsvUtil(扩展)

来源地址:https://blog.csdn.net/JokerLJG/article/details/127450857

--结束END--

本文标题: Java中csv文件读写分析

本文链接: https://www.lsjlt.com/news/401471.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中csv文件读写分析
    文章目录 一、txt、csv、tsv文件二、csv文件规范三、csv使用场景四、Java中的csv类库1. javacsv2. opencsv写入器读取器解析器注解映射策略MappingStr...
    99+
    2023-09-09
    java opencv
  • Python读写CSV文件
    csv模块方法csv.readerimport csv    with open('temp.csv','rb') as f:         reader = csv.reader(f)         for row in reader...
    99+
    2023-01-31
    文件 Python CSV
  • Python取读csv文件做dbscan分析
    目录1.读取csv数据做dbscan分析2.输出结果显示3.计算效率1.读取csv数据做dbscan分析 读取csv文件中相应的列,然后进行转化,处理为本算法需要的格式,然后进行db...
    99+
    2022-11-10
  • 在 Java 中读取 CSV 文件
    CSV 代表逗号分隔值,是一种非常流行的文件类型。CSV文件用于存储由逗号分隔的信息。文件的每一行都用于表示一个数据记录。在本教程中,我们将学习如何读取 CSV 文件并将其内容复制到数组或列表中。在本教程中,我们将使用仅包含三条记录的简单 ...
    99+
    2023-09-06
    java 前端 html
  • 使用Python读写csv文件
    简介:CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。又称逗号分隔值(Comma-Separated Values,CS...
    99+
    2022-11-13
  • Android怎么读写CSV文件
    小编给大家分享一下Android怎么读写CSV文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言Android读写CSV文件的相关内容,CSV也就是Comma...
    99+
    2023-05-30
    android csv文件
  • Python数据读写之Python读写CSV文件
    目录1. 读取CSV文件 csv.reader()2. 写入CSV文件1. 读取CSV文件 csv.reader() 该方法的作用相当于就是通过 ',' 分割csv格...
    99+
    2022-11-11
  • Python怎么取读csv文件做dbscan分析
    本篇内容介绍了“Python怎么取读csv文件做dbscan分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.读取csv数据做dbsca...
    99+
    2023-06-30
  • python 读写csv格式的文件
    python在它的标准库中包含了csv模块。 例子环境 python3.4 win7 32位 1.读取csv文件 csvTest-data.csv内容如下: ItemID,Name,Description,Owner,Bor...
    99+
    2023-01-31
    格式 文件 python
  • python读写csv文件的实战
    csv介绍csv是什么?大家估计都听过,不过我猜很少能有人比较全面的解释下的,那么小弟就献丑一下。csv我理解的是一个存储数据的文件,里面以逗号作为分割进行存储(当然也可以用制表符进行分割)。csv的规则1 开头是不留空,以行为单位。2 可...
    99+
    2023-01-31
    实战 文件 python
  • C#CSV文件读写的实现
    目录为什么要用csv文件一、DataTable数据写入CSV文件二、读取CSV文件到DataTable三、修改文件名称四、CSV文件的数据写入CSV是一种通用的、相对简单的文件格式,...
    99+
    2023-03-03
    C# CSV文件读写 C# CSV 读写
  • Python读取csv文件做K-means分析详情
    目录1.运行环境及数据2.基于时间序列的分析2D2.1 2000行数据结果展示2.2 6950行数据结果展示2.3 300M,约105万行数据结果展示 3.经纬度高程三维坐...
    99+
    2022-11-13
  • 如何运用python读写CSV文件
    目录1、使用基础Python代码来读写和处理CSV文件2、使用pandas读写和处理CSV文件3、使用内置csv读写和处理CSV文件1、使用基础Python代码来读写和处理CSV文件 import sys #使用...
    99+
    2022-06-02
    python读CSV文件 python读写CSV文件 python CSV文件
  • C#如何实现读写CSV文件
    这篇文章主要介绍“C#如何实现读写CSV文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现读写CSV文件”文章能帮助大家解决问题。CSV文件标准在介绍CSV文件的读写方法前,我们需要了解...
    99+
    2023-07-02
  • 怎么使用Python读写CSV文件
    这篇文章主要介绍了怎么使用Python读写CSV文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Python读写CSV文件文章都会有所收获,下面我们一起来看看吧。1. 读取CSV文件 csv.read...
    99+
    2023-07-02
  • C# CSV文件读写如何实现
    这篇文章主要介绍了C# CSV文件读写如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C# CSV文件读写如何实现文章都会有所收获,下面我们一起来看看吧。CSV是一种通用的、相对简单的...
    99+
    2023-07-05
  • Python——csv文件的写入与读取
    1.csv文件介绍 CSV文件是一种常见的数据格式,它以逗号分隔不同的字段,每行表示一个数据记录。在Python中,我们可以使用csv模块来读取和写入CSV文件。 2.写入CSV文件 在Python中,我们可以使用csv模块的writer对...
    99+
    2023-09-04
    python 开发语言
  • python中如何读取和写入CSV文件
    本文小编为大家详细介绍“python中如何读取和写入CSV文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中如何读取和写入CSV文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。CSV(Comma...
    99+
    2023-07-04
  • pythonpandas解析(读取、写入)CSV文件的操作方法
    目录1. 使用 pandas 读取 CSV 文件2. 使用 pandas 写入 CSV 文件1. 使用 pandas 读取 CSV 文件 原始数据包含了公司员工的数据: NameHi...
    99+
    2022-12-23
    python pandas 解析CSV 文件 pandas 读取 CSV 文件 pandas 写入 CSV 文件
  • R语言文本文件读写(txt/csv/xlsx)
    本文主要介绍了R语言文本文件读写,分享给大家,具体如下: read.table(file,sep,hesder) #file 文件路径 #sep 分隔符 #header 第一行是...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作