[Java]Java操作csv文件,增删改。

本文介绍了如何使用Java操作CSV文件,包括增、删、改功能。通过引入javacsv库,详细讲解了读写CSV文件的步骤,并给出了注意事项,如处理逗号分隔、字符集选择和科学计数法问题,以确保数据正确无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:

今天朋友找我帮忙写一个操作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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值