说明:
今天朋友找我帮忙写一个操作csv文件的程序,本来想拒绝,但是一想也是一个锻炼机会,百度搜了下工具包和基本案例:这个博主写的挺好的
https://blog.csdn.net/lcr_happy/article/details/81563354
拿来自己增加了一些功能
具体功能是根据两表相同惟一的id把表2里的数据放入表1
工具类
首先是工具类:读写csv文件的jar包
下载地址:
http://repo.boundlessgeo.com/main/net/sourceforge/javacsv/javacsv/2.1/javacsv-2.1.jar
代码:
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import org.junit.Test;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
/**
* 逻辑就是把一个文件的所有内容临时保存到List里面,
* 每个list.get(i)就是文件的每一行数据
* 思路:读取每一行,字符串,按照,分隔成String[]数组,然后把这些数组一个个存到ArrayList里,
* 这样就都是有序的,然后循环遍历2个对象的这些ArrayList集合就行了。
*/
/**
* 注意事项,文件需要直接放在项目下,不要放到src目录下
*/
public class CsvToCsv2 {
public static void main(String args[]) {
//创建经纬度文件对象
CsvToCsv2 csv1 = new CsvToCsv2();
// TODO 读取经纬度文件信息存入list1,把表名改成经纬度表名
ArrayList<String[]> list1 = csv1.read("1497.csv");
//创建主表文件对象
CsvToCsv2 csv2 = new CsvToCsv2();
// TODO 读取主表文件信息存入list2,把表名改成主表名
ArrayList<String[]> list2 = csv2.read("20141201014648.csv");
//写入方法
// TODO 新生成文件的名称:
String newstr= "testWrite.csv";
write(newstr,list1, list2);
}
/**
* 读取文件信息,存入ArrayList集合
*/
public ArrayList<String[]> read(String filePath){
ArrayList list = null;
try {
list=new ArrayList();
// 创建CSV读对象,设置字符集为GBK
CsvReader csvReader = new CsvReader(filePath,',', Charset.forName("GBK"));
// 读表头,返回的是布尔值
csvReader.readHeaders();
//这是循环读取
while (csvReader.readRecord()){
// 读一整行,默认是以逗号分离的
String rawRecord = csvReader.getRawRecord();
//转换读取的行分成数组,split方法是把字符串根据符号","拆分成一个String数组
String[] split = rawRecord.split(",");
//把每一行的分出来的数组添加到集合list里
list.add(split);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
return list;
}
}
/**
*写入新文件
*/
public static void write(String filePath,ArrayList<String[]> list1,ArrayList<String[]> list2){
try {
// 创建CSV写对象,设置字符集是GBK,分隔符是","
CsvWriter csvWriter = new CsvWriter(filePath,',', Charset.forName("GBK"));
//CsvWriter csvWriter = new CsvWriter(filePath);
//读取一行
for (int i = 0; i < list1.size(); i++) {
//读取特定列,不需要循环
//循环list2的特定列
for (int j = 0; j < list2.size(); j++) {
//strs1,表示经纬度表的当前行
String[] strs1 = list1.get(i);
//strs2,表示主表的当前行
String[] strs2 = list2.get(j);
//如果相同,就加经纬度数据到list2
// TODO 此处表示索引19,因为数组是从0开始计数,表示第20列
if (strs2[19].equals(strs1[0])) {// TODO 表示判断表2当前行的20列等于表1当前行的第1列
//记录是第几行j,把i的数据存到list里
//数组拼接
//TODO new String[23];表示新的数组长度为23,怎么计算,你要多少列这里就是多少,这里表1数据21列,表2数据需要的为2列,所以是23。
String[] newstrs = new String[23];
for (int n = 0; n <strs2.length; n++) {
//先拼接原有部分
newstrs[n]=strs2[n];
}
// TODO 下面的insert=3是开始拼接的列索引,也就是想要插入的经纬度的部分
int insert=3;
for (; insert < strs1.length; insert++) {
//再拼接多的部分
// TODO 这里记得减掉上面的insert初始值3,以后改了上面初始值这里下面也要改 newstrs[strs2.length+insert- 3 ]
newstrs[strs2.length+insert-3]=strs1[insert];
}
//list2重新覆盖设置第j行数据为数组newstrs。
list2.set(j,newstrs);
}
}
}
//写表头
String[] headers={"aqi","area","co","co_24h","no2","no2_24h","o3","o3_24h","o3_8h","o3_8h_24h","pm10","pm10_24h","pm2_5","pm2_5_24h","position_name","primary_pollutant","quality","so2,so2_24h","station_code","time_point","经度","纬度"};
csvWriter.writeRecord(headers);
//表内容
String[] content =null;
for (String[] strings : list2) {
content =strings;
csvWriter.writeRecord(content);
}
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意事项:
1. 首先这个工具类读取csv文件是按照",“分隔列,
所以如果原有数据表里有”,“逗号的话,请提前在excel里用全文替换成”、"顿号或者别的表格内容没有的符号。
比如_下划线…当然不要用可能在java中造成歧义的符号。
2. 设置读写字符集都要设置为:GBK,一般生成CSV文件的软件默认字符集是GBK。不提前设置,就会出现乱码问题。
3. 科学计数法问题:长串数字读取成科学计数法形式:1.4E+~~
https://blog.csdn.net/gaoweijiegwj/article/details/52949895?utm_source=app
本文介绍了如何使用Java操作CSV文件,包括增、删、改功能。通过引入javacsv库,详细讲解了读写CSV文件的步骤,并给出了注意事项,如处理逗号分隔、字符集选择和科学计数法问题,以确保数据正确无误。
8687

被折叠的 条评论
为什么被折叠?



