目录
3.1.POM文件----commons-csv作为三方类库
一,Java简介
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性。Java可以用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序和嵌入式系统应用程序等。Java的开发工具和框架也非常丰富,如Eclipse、IntelliJ IDEA、Spring等。Java的语法和结构类似于C++,但是Java具有更高的安全性和可移植性,因为Java程序在编译后会被转换成字节码,可以在任何支持Java虚拟机(JVM)的平台上运行。
二、CSV文件简介
2.1.CSV文件介绍
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一。
CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是bitASCII是最基本的通用编码。
2.2.CSV文件特点
“CSV”并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:
1、纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
2、由记录组成(典型的是每行一条记录);
3、每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
4、每条记录都有同样的字段序列。
2.3. CSV文件规则
1、开头是不留空,以行为单位。
2、可含或不含列名,含列名则居文件第一行。
3、一行数据不跨行,无空行。
4、以半角逗号(即,)作分隔符,列为空也要表达其存在。
5、列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。
6、文件读写时引号,逗号操作规则互逆。
7、内码格式不限,可为 ASCII、Unicode 或者其他。
8、不支持数字
9、不支持特殊字符
三、CSVParser文件读取
3.1.POM文件----commons-csv作为三方类库
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.9.0</version>
</dependency>
3.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.*;
import java.util.ArrayList;
import java.util.List;
/**
* @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 类是用于读取字符文件的,但它默认使用平台默认的字符编码
FileReader reader= new FileReader("C:\\Users\\abc\\Desktop\\Jfile\\20230731-3.csv");
CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
//定义List用于接收文件数据
List<String> list = new ArrayList<>();
// 遍历CSV文件的每一行并获取单元格数据
for (CSVRecord record : parser) {
String str = "";
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 + "|";
}
}else {
if (null != record.get(i)) {
str = str + record.get(i);
}
}
}
str += "\r\n";
list.add(str);
System.out.print("str输出验证 = " + str);
}
// 关闭流
parser.close();
reader.close();
}
}
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文件(方法一的优化)
FileInputStream fis = new FileInputStream("C:\\Users\\abc\\Desktop\\Jfile\\20230731-3.csv");
InputStreamReader isr = new InputStreamReader(fis, "GBK");
BufferedReader reader = new BufferedReader(isr);
// FileReader 类是用于读取字符文件的,但它默认使用平台默认的字符编码,限制较大
// 使用BufferedReader包装FileReader以便按行读取文件内容
CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
//定义List用于接收文件数据
List<String> list = new ArrayList<>();
// 遍历CSV文件的每一行并获取单元格数据
for (CSVRecord record : parser) {
String str = "";
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 + "|";
}
}else {
if (null != record.get(i)) {
str = str + record.get(i);
}
}
}
str += "\r\n";
list.add(str);
System.out.print("str输出验证 = " + str);
}
// 关闭流
parser.close();
reader.close();
isr.close();
fis.close();
}
}
3.3.优缺点
优点:代码简单,不需要手动分割数据;
四,第二个csv读取和输出
1、通过FileReader(String fileName)读取整个文件,并通过BufferedReader(Reader in)作为每行的缓冲;
2、在通过readLine()读取每行内容,通过空格作为分隔符,每行转为数组,并存在List<String[]>列表中;
3、最后打印 csv文件中的内容。
-
4.1csv 文件内容如下:
-
clk 101 111 reset 102 112 test 103 113 Mode1 104 114 Mode0 105 115
-
4.2打印的代码如下:
-
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class transform { List<String[]> ReadMethod(){ String File = "C:/Users/zeal.zhang/Documents/ExamB/src/Data/1.csv"; String line = ""; String SplitBy = " "; String[] Line; List<String[]> BikeDataList = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(File))) { while ((line = br.readLine()) != null) { Line = line.split(SplitBy); BikeDataList.add(Line); System.out.println("signal "+Line[0]+" {\n\tsite 1 { pogo = "+Line[1]+"; }" + "\n\tsite 2 { pogo = "+Line[2]+"; }\n}"); } } catch (IOException e) { e.printStackTrace(); } return BikeDataList; } public static void main(String[] args) { new transform().ReadMethod(); }
-
4.3输出的内容如下:
-
写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/134809812?spm=1001.2014.3001.9457signal clk { site 1 { pogo = 101; } site 2 { pogo = 111; } } signal reset { site 1 { pogo = 102; } site 2 { pogo = 112; } } signal test { site 1 { pogo = 103; } site 2 { pogo = 113; } } signal Mode1 { site 1 { pogo = 104; } site 2 { pogo = 114; } } signal Mode0 { site 1 { pogo = 105; } site 2 { pogo = 115; } }