java环境下读取CSV文件(已优化)

目录

一、CSV文件简介

1.1.CSV文件介绍

1.2.CSV文件特点 

1.3. CSV文件规则

1.4.编者记录 

二、CSVParser文件读取 

 2.1.POM文件----commons-csv作为三方类库

 2.2.测试代码

 2.3.优缺点

三、将CSV文件转化为Excel的xlsx文件

3.1.POM文件 

 3.2.测试代码

 3.3.运行结果

 3.4.优缺点

四、CsvReader文件读取 

 4.1.POM文件

4.2.测试代码一

4.2.1.测试代码

4.2.2.运行截图

4.3.测试代码二

4.3.1.测试代码 

4.3.2.运行截图

 4.4.优缺点

五、CsvReader文件读取 

 5.1.POM文件

5.2.测试代码

 5.3.运行截图


一、CSV文件简介

1.1.CSV文件介绍

         逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一。
        CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是bitASCII是最基本的通用编码。

1.2.CSV文件特点 

        “CSV”并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:
        1、纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
        2、由记录组成(典型的是每行一条记录);
        3、每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
        4、每条记录都有同样的字段序列。 

1.3. CSV文件规则

        1、开头是不留空,以行为单位。
        2、可含或不含列名,含列名则居文件第一行。
        3、一行数据不跨行,无空行。
        4、以半角逗号(即,)作分隔符,列为空也要表达其存在。
        5、列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。
        6、文件读写时引号,逗号操作规则互逆。
        7、内码格式不限,可为 ASCII、Unicode 或者其他。
        8、不支持数字
        9、不支持特殊字符

1.4.编者记录 

 以上信息来自百度百科。由上述信息可知,CSV文件是以表格形式存在的文本文件,不能用读取表格的方法读取CSV文件。同时文件整体框架确定,但具体形式不固定,所以本文仅记录CSV文件的读取,不做详细数据处理。

二、CSVParser文件读取 

 2.1.POM文件----commons-csv作为三方类库

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-csv</artifactId>
	<version>1.9.0</version>
</dependency>

 2.2.测试代码

package com.task.test;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

/**
 * @ClassName: Test5
 * @Author: BlueBlue
 * @Description:
 * @Date: 2023/3/8 0008 11:17
 */
public class Test5 {

    public static void main(String[] args) throws IOException {

        // 读取CSV文件
        FileReader file= new FileReader("文件绝对路径");
        FileInputStream fis = new FileInputStream(file); 
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 
        CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);

        ArrayList<String> list = new ArrayList<>();
        String str = null;
        // 遍历CSV文件的每一行并获取单元格数据
        for (CSVRecord record : parser) {
            for (int i = 0; i < record.size(); i++) {
                if (i < record.size()-1) {
                    if (null != record.get(i)) {
                        str = str + record.get(i) + "|";
                    }else {
                        str = str + "|";
                    }
                }
            }
            System.out.println(str);
        }
        // 关闭流
        parser.close();
        isr.close(); 
		fis.close();
        file.close();
    }
}

 2.3.优缺点

         优点:代码简单,不需要手动分割数据;

三、将CSV文件转化为Excel的xlsx文件

3.1.POM文件 

<!-- https://mvnrepository.com/artifact/e-iceblue/spire.xls.free -->
<dependency>
	<groupId>spire.xls.free</groupId>
	<artifactId>spire-xls-free</artifactId>
	<version>5.1.0</version>
</dependency>

 3.2.测试代码

package com.task.test;

import com.spire.xls.*;

import java.util.EnumSet;

/**
 * @ClassName: Test4
 * @Author: BlueBlue
 * @Description:
 * @Date: 2023/3/7 0007 17:31
 */
public class Test4 {

    public static void main(String[] args) {
        //思路:将原文件用表格打开,并保存为新表格

        System.out.println("文件转化开始!");
        //加载CSV文件
        Workbook workbook = new Workbook();

        //原截图存在中文乱码,现已优化
        //Excel版本与下文保持一致即可,具体版本看自己选择
        workbook.loadFromFile("C:\\Users\\cuipa\\Desktop\\Jfile\\20230731-3.csv", ",", 1, 1,ExcelVersion.Version2013, Charset.forName("GBK"));

        //获取第一个工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        //访问工作表中使用的范围
        CellRange usedRange = sheet.getAllocatedRange();
        //当将范围内的数字保存为文本时,忽略错误
        usedRange.setIgnoreErrorOptions(EnumSet.of(IgnoreErrorType.NumberAsText));

        //自适应行高、列宽
        usedRange.autoFitColumns();
        usedRange.autoFitRows();

        //保存文档
        workbook.saveToFile("C:\\Users\\cuipa\\Desktop\\Jfile\\CSVtoExcel.xlsx", ExcelVersion.Version2013);
        System.out.println("文件转换结束!");
    }

}

 3.3.运行结果

test4优化后截图

 3.4.优缺点

         优点:代码简单,可自定义数据分隔符

         缺点:只能转化为xlsx文件,且转化后还需要代码读取xlsx文件

四、CsvReader文件读取 

 4.1.POM文件

<!--csv文件操作-->
<dependency>
	<groupId>net.sourceforge.javacsv</groupId>
	<artifactId>javacsv</artifactId>
	<version>2.0</version>
</dependency>

4.2.测试代码一

4.2.1.测试代码

package com.task.test;

import com.csvreader.CsvReader;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: Test2
 * @Author: BlueBlue
 * @Description:
 * @Date: 2023/3/7 0007 15:50
 */
public class Test2 {
    public static void main(String[] args) {
        String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
        List<String[]> list = Test2.readCsvByCsvReader(fileName);
        for (String[] str :list) {
            for (String num : str) {
                System.out.print(num + "|");
            }
        }

        //打印二
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.get(i).length; j++) {
                System.out.println(list.get(i)[j]);
            }
        }

    }

    public static List<String[]> readCsvByCsvReader(String filePath) {
        List<String[]> arrList = new ArrayList<String[]>();
        try {
            CsvReader reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
            while (reader.readRecord()) {
                arrList.add(reader.getValues()); // 按行读取,并把每一行的数据添加到list集合
            }
            reader.close();
            System.out.println("读取的行数:" + arrList.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return arrList;
    }

}

4.2.2.运行截图

  

4.3.测试代码二

4.3.1.测试代码 

package com.task.test;

import com.csvreader.CsvReader;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @ClassName: Test2
 * @Author: BlueBlue
 * @Description:
 * @Date: 2023/3/7 0007 15:50
 */
public class Test2 {
        String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
        List<List<String>> list2 = Test2.readCsvByCsvReader2(fileName);
        for (int i = 0; i < list2.size(); i++) {
            for (int j = 0; j < list2.get(i).size(); j++) {
                if (list2.get(i).get(j) != null) {
                    System.out.println(list2.get(i).get(j));
                }
            }
        }

    }


    public static List<List<String>> readCsvByCsvReader2(String filePath) {
        List<List<String>> arrList = new ArrayList<List<String>>();
        try {
            CsvReader reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
            while (reader.readRecord()) {
                arrList.add(Arrays.asList(reader.getValues())); // 按行读取,并把每一行的数据添加到list集合
            }
            reader.close();
            System.out.println("读取的行数:" + arrList.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return arrList;
    }


}

4.3.2.运行截图

 4.4.优缺点

        优点:代码简单,可自行调节文本分隔符和读取文件的编码

        缺点:不知道,以后再说

        注:两个测试类没区别,就是返回值的数据类型不一样

五、CsvReader文件读取 

 5.1.POM文件

<!--csv文件操作-->
<dependency>
	<groupId>net.sourceforge.javacsv</groupId>
	<artifactId>javacsv</artifactId>
	<version>2.0</version>
</dependency>

5.2.测试代码

package com.task.test;

import com.csvreader.CsvReader;

import java.io.*;
import java.text.ParseException;

/**
 * @ClassName: Test1
 * @Author: BlueBlue
 * @Description:
 * @Date: 2023/3/7 0007 11:34
 */
public class Test1 {

    public static void main(String[] args) throws IOException, ParseException {
        String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
        DataInputStream inFile = new DataInputStream(new FileInputStream(fileName));
        BufferedReader reader = new BufferedReader(new InputStreamReader(inFile, "GBK"));//这里如果csv文件编码格式是GBK,改成GBK即可
        CsvReader creader = new CsvReader(reader, ',');
        String[] TxtInfo = null;
        for (int j = 0; creader.readRecord(); j++) {
            TxtInfo = creader.getRawRecord().split(",");
            System.out.println(creader.getRawRecord());
//          System.out.println("TxtInfo[1]:"+TxtInfo[1]);
        }
        creader.close();
        reader.close();
        inFile.close();
    }
}

 5.3.运行截图

猜你喜欢

转载自blog.csdn.net/weixin_52255395/article/details/129832961