逗号分隔值(CSV)文件,将数据逐列存储,并用分隔符将其分开(通常是逗号",")。可直接使用记事本打开查看。
有很多种读写CSV文件的方法,这里介绍的是JavaCSV。Java CSV是一个小型的快速开源Java库,用于读取和写入CSV和纯分隔文本
文件。可以处理各种CSV文件,文本限定,Excel格式等。
JavaCSV 下载
使用这个jar包需要添加依赖,方法就不必赘述了,网上大批教程,需要的可以自己搜索。
直接上代码
package com.example.myapplication;
import java.io.IOException;
import java.nio.charset.Charset;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
public class MainActivity {
public void readCSV() {
//读CSV
try {
//filePath是CSV文件的全路径,根据自己的实际情况填写
CsvReader csvReader = new CsvReader("filePath");
//读表头
csvReader.readHeaders();
while (csvReader.readRecord()) {
//读取一整行
System.out.println(csvReader.getRawRecord());
//读取这行的某列,序号从0开始,csvReader.get(0)读取的是这行的第一列
System.out.println(csvReader.get(0));
//读取这行的某列,column是列名,根据实际情况填写
System.out.println(csvReader.get("column"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeCSV() {
//写CSV
try {
//filePath是CSV文件的全路径,根据自己的实际情况填写
CsvWriter csvWriter = new CsvWriter("filePath");
//写入一行
String s[] = {"1", "2"};
csvWriter.writeRecord(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代码可以完成英文CSV文件的读写,但读写中文将出现乱码,在网上找了很久也没找到解决方案。
后来查看JavaCSV源码的时候,看到了这个构造函数
public CsvReader(String var1, char var2, Charset var3) throws FileNotFoundException {
if (var1 == null) {
throw new IllegalArgumentException("Parameter fileName can not be null.");
} else if (var3 == null) {
throw new IllegalArgumentException("Parameter charset can not be null.");
} else if (!(new File(var1)).exists()) {
throw new FileNotFoundException("File " + var1 + " does not exist.");
} else {
this.fileName = var1;
this.userSettings.Delimiter = var2;
this.charset = var3;
this.isQualified = new boolean[this.values.length];
}
}
public CsvReader(String var1, char var2) throws FileNotFoundException {
this(var1, var2, Charset.forName("ISO-8859-1"));
}
public CsvReader(String var1) throws FileNotFoundException {
this(var1, ',');
}
这一下就明了了。var1是文件的路径,var2是分隔符,var3是字符编码集。
开始我们使用的是单参构造函数,它会调用双参构造函数,双参构造函数再调用三参构造函数。
这样的话我们的默认编码集就是"ISO-8859-1",但这默认的编码集并不一定是我们文件的实际编码集。
如果不想遇见中文乱码的情况,就要确定文件实际使用的编码集(可以用记事本另存为查看),并用该编码集作为var3参数来创建对象。
下附代码
package com.example.myapplication;
import java.io.IOException;
import java.nio.charset.Charset;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
public class MainActivity {
public void readCSV() {
try {
//filePath是CSV文件的全路径,utf-8是编码集,根据自己的实际情况填写
CsvReader csvReader = new CsvReader("filePath",',', Charset.forName("utf-8"));
//读表头
csvReader.readHeaders();
while (csvReader.readRecord()) {
//读取一整行
System.out.println(csvReader.getRawRecord());
//读取这行的某列,序号从0开始,csvReader.get(0)读取的是这行的第一列
System.out.println(csvReader.get(0));
//读取这行的某列,column是列名,根据实际情况填写
System.out.println(csvReader.get("column"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeCSV() {
try {
//filePath是CSV文件的全路径,GBK是编码集,根据自己的实际情况填写。
CsvWriter csvWriter = new CsvWriter("filePath",',',Charset.forName("GBK"));
//写入一行
String s[] = {"1", "2"};
csvWriter.writeRecord(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}



