使用commons-csv简单读写CSV文件

文章首发于我的github博客

需求

客户的开发测试环境将做迁移。因此需要对zookeeper上的重要的数据以CSV文件格式做备份。
本文通过Apache的commons-csv操作CSV文件。官网地址:http://commons.apache.org/proper/commons-csv/

基本概念

维基百科对CSV的解释:

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须象二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

代码

API使用很简单,直接上代码了。

  • 依赖包:

    <properties>
        <slf4j.version>1.7.2</slf4j.version>
        <log4j.version>1.2.17</log4j.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>
  • 配置文件csv.properties:
    # csv file output path(write)
    csvfile.output.path=D:/zk-backup/zk-privilige.csv
    # csv file input path(read)
    csvfile.input.path=D:/zk-backup/zk-privilige.csv
    #csvfile.input.path=/opt/apps/zk-recovery/zk-privilige.csv
    # csv header,使用逗号分隔
    csv.header=id,name,designation,company
  • 工具类:

① CSVWriter.java

package com.yeyouluo.csv.util;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.log4j.Logger;

/**
 * 写CSV工具类
 * @author yeyouluo
 *
 */
public class CSVWriter {

    private static final Logger logger = Logger.getLogger(CSVWriter.class);

    /**
     * 写CSV文件
     * @param csvFile csv文件名称
     * @param fileHeader 文件头
     * @param content 内容
     * @throws IOException
     */
    public static void write(final String csvFile, final String[] fileHeader, List<String[]> content)
            throws IOException {
        BufferedWriter writer = Files.newBufferedWriter(Paths.get(csvFile));
        CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(fileHeader));

        for (String[] c : content) {
            csvPrinter.printRecord(Arrays.asList(c));
        }
        csvPrinter.flush();
        logger.info( "====> 成功写入CSV文件。文件路径:" + csvFile );

    }
}

②CSVReaderWithlHeader.java

package com.yeyouluo.csv.util;

import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

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

/**
 * 读带文件头的CSV文件工具类
 * @author yeyouluo
 *
 */
public class CSVReaderWithlHeader {
    /**
     *
     * @param csvFile    CSV文件
     * @param fileHeader  CSV文件头
     * @param skipHeader  是否跳过文件头
     * @return              CSV记录链表
     * @throws IOException
     */
    public static List<CSVRecord> read(final String csvFile, final String[] fileHeader, boolean skipHeader)
            throws IOException {
        CSVFormat format;

        if (skipHeader) {
            // 这里显式地配置一下CSV文件的Header,然后设置跳过Header(要不然读的时候会把头也当成一条记录)
            format = CSVFormat.DEFAULT.withHeader(fileHeader).withFirstRecordAsHeader().withIgnoreHeaderCase()
                    .withTrim();
            // format = CSVFormat.DEFAULT.withHeader(fileHeader)
            // .withIgnoreHeaderCase().withTrim().withSkipHeaderRecord();
        } else {
            format = CSVFormat.DEFAULT.withHeader(fileHeader).withIgnoreHeaderCase().withTrim();
        }
        Reader reader = Files.newBufferedReader(Paths.get(csvFile));

        CSVParser csvParser = new CSVParser(reader, format);
        return csvParser.getRecords();
    }

    /**
     * 读取CSV文件,默认跳过文件头
     * @param csvFile    CSV文件
     * @param fileHeader  CSV文件头
     * @return          CSV记录链表
     * @throws IOException
     */
    public static List<CSVRecord> read(final String csvFile, final String[] fileHeader)
            throws IOException{
        return read(csvFile, fileHeader, true);
    }

}
  • 测试类

① CSVWriteService.java

package com.yeyouluo.csv.service;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.log4j.Logger;

import com.yeyouluo.csv.util.CSVWriter;

/**
 * 写CSV
 * @author yeyouluo
 *
 */
public class CSVWriteService {
    private static final Logger logger = Logger.getLogger(CSVWriter.class);

    private static String csvFile;  // csv文件路径

    private static String[] fileHeader;  // csv文件头

    static {
        // 读取配置文件
        Properties prop = new Properties();
        InputStream in = CSVWriter.class.getResourceAsStream("/csv.properties");
        try {
            prop.load(new InputStreamReader(in,"UTF-8"));
            String root = CSVWriter.class.getResource("/").getPath();
            csvFile = prop.getProperty("csvfile.output.path");
            String headers = prop.getProperty("csv.header");
            fileHeader = headers.split(",");
        } catch (Exception e) {
            logger.error("",e);
        } finally {
            if( in != null ) {
                try {
                    in.close();
                } catch (IOException e) {
                    logger.error("",e);
                }
            }
        }

        // 创建父目录
        File parentDir = new File(csvFile).getParentFile();
        if( !parentDir.exists() ) {
            logger.warn("CSV文件父目录不存在,即将创建...");
            parentDir.mkdirs();
        }
    }

    public void wirte(List<String[]> content) {
        try {
            CSVWriter.write(csvFile, fileHeader, content);
        } catch (IOException e) {
            logger.error("写CSV文件出现问题",e);
        }
    }

    public static void main(String[] args) {
        List<String[]> list = new ArrayList<String[]>();
        list.add(new String[] {"1", "Sundar Pichai ?", "CEO", "Google"});
        list.add(new String[] {"2", "Satya Nadella", "CEO", "Microsoft"});
        list.add(new String[] {"3", "Tim cook", "CEO", "Apple"});
        list.add(new String[] {"4", "Mark Zuckerberg", "CEO", "Facebook"});

        CSVWriteService csvWriteService = new CSVWriteService();
        csvWriteService.wirte(list);
    }
}

②CSVReaderWithlHeaderService.java

package com.yeyouluo.csv.service;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;

import org.apache.commons.csv.CSVRecord;
import org.apache.log4j.Logger;

import com.yeyouluo.csv.util.CSVReaderWithlHeader;

/**
 * 读CSV
 * @author yeyouluo
 *
 */
public class CSVReaderWithlHeaderService {

    private static final Logger logger = Logger.getLogger(CSVReaderWithlHeaderService.class);

    private static String csvFile;  // csv文件路径

    private static String[] fileHeader;  // csv文件头

    static {
        // 读取配置文件
        Properties prop = new Properties();
        InputStream in = CSVReaderWithlHeaderService.class.getResourceAsStream("/csv.properties");
        try {
            prop.load(new InputStreamReader(in,"UTF-8"));
            String root = CSVReaderWithlHeaderService.class.getResource("/").getPath();
            csvFile = prop.getProperty("csvfile.input.path");
            String headers = prop.getProperty("csv.header");
            fileHeader = headers.split(",");
        } catch (Exception e) {
            logger.error("",e);
        } finally {
            if( in != null ) {
                try {
                    in.close();
                } catch (IOException e) {
                    logger.error("",e);
                }
            }
        }

        // 创建父目录
        File parentDir = new File(csvFile).getParentFile();
        if( !parentDir.exists() ) {
            logger.warn("CSV文件父目录不存在,即将创建...");
            parentDir.mkdirs();
        }
    }

    public void read() {
        try {
            List<CSVRecord> list =  CSVReaderWithlHeader.read(csvFile, fileHeader);
            for (CSVRecord csvRecord : list) {
                // Accessing values by the names assigned to each column

                String id = csvRecord.get("ID");
                String name = csvRecord.get("Name");
                String designation = csvRecord.get("Designation");
                String company = csvRecord.get("Company");

                System.out.println("Record No - " + csvRecord.getRecordNumber());
                System.out.println("---------------");
                System.out.println("ID : " + id);
                System.out.println("Name : " + name);
                System.out.println("Designation : " + designation);
                System.out.println("Company : " + company);
                System.out.println("---------------\n\n");
            }
        } catch (IOException e) {
            logger.error("读取CSV文件出现错误",e);
        }
    }

    public static void main(String[] args) {
        CSVReaderWithlHeaderService service = new CSVReaderWithlHeaderService();
        service.read();
    }

}

执行结果

  • 执行CSVWriteService.java
2018-03-03 11:05:43,551 [main] WARN  [com.yeyouluo.csv.util.CSVWriter] - CSV文件父目录不存在,即将创建...
2018-03-03 11:05:43,590 [main] INFO  [com.yeyouluo.csv.util.CSVWriter] - ====> 成功写入CSV文件。文件路径:D:/zk-backup/zk-privilige.csv
  • 执行CSVReaderWithlHeaderService.java
Record No - 1
---------------
ID : 1
Name : Sundar Pichai ?
Designation : CEO
Company : Google
---------------

Record No - 2
---------------
ID : 2
Name : Satya Nadella
Designation : CEO
Company : Microsoft
---------------

Record No - 3
---------------
ID : 3
Name : Tim cook
Designation : CEO
Company : Apple
---------------

Record No - 4
---------------
ID : 4
Name : Mark Zuckerberg
Designation : CEO
Company : Facebook
---------------

源码打包下载

链接: https://pan.baidu.com/s/1qZZru2K 密码: 866h

参考网址

原文地址:https://www.cnblogs.com/helloIT/p/8496094.html

时间: 2024-08-29 09:40:36

使用commons-csv简单读写CSV文件的相关文章

python3使用csv模块读写csv文件

python3使用csv模块读写csv文件 读取csv文件: import csv #打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文件,只能用open() with open("XXX.csv","r",encoding="utf-8") as csvfile: #读取csv文件,返回的是迭代类型 read = csv.reader(csvfile) for i in read: print(i) 存

C# 读写XML文件最简单方法

C#史上最简单读写xml文件方式,创建控制台应用程序赋值代码,就可以运行,需要改动,请自行调整 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace ConsoleApp1 { class Program { public cons

C#中XmlTextWriter读写xml文件详细介绍

XmlTextWriter类允许你将XML写到一个文件中去.这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML.为了使用这个类,你必须首先创建一个新的XmlTextWriter对象,然后你可以将XML片断加入到这个对象中.这个类中包含了不少的方法用于将各种类型的XML元素添加到XML文件中,下表给出了这些方法的名字和描述情况: 方法 描述 WriteStartDocument 书写版本为"1.0"的 XML 声明 WriteEndDocument 关闭任何打开的元

如何用python读写CSV 格式文件

工作中经常会碰到读写CSV文件的情况.记录下,方便自己以后查询并与大家一起分享: 写CSV文件方法一: import csv          #导入CSV with open("D:\egg.csv","wb") as csvfile       #新建一个叫egg.csv"的文件在D盘. a=csv.writer(csvfile)                                    #以CSV的格式 写数据到文件CSVFILE中. a

用opencsv文件读写CSV文件

首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解就进入主题,用Opencsv读写csv文件 读:CSVReader 写:CSVWriter 下面分别来看一下opencsv为我们提供的方法(这里只介绍最常用的几个): 读:CSVReader 构造器中涉及三个参数: reader:就是读取文件的流对象,常用的有BufferedReader,Input

python读写csv文件

python自带有csv模块,如果想了解更详细的内容,可以参考官方文档 一.读操作 不知道为什么,要是打开文件时不使用'b'模式,就会有隔行出现,所以,在windows中想要正常操作csv文件,就加上b模式.delimiter来指定reader各个域之间的分隔符. def readData(): with open('csvFile.csv','rb') as fobj: csvFileReader = csv.reader(fobj,delimiter='-'); header = next(

如何通过 JavaCSV 类库来优雅地(偷懒)读写 CSV 文件?

欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! 个人博客: https://www.exception.site/essay/how-to-create-read-csv-by-javacsv 一.背景 小哈公司最近准备开发一套新的平台,具体什么平台,因为涉密,这里就不透露了.平台在最终的的技术选型中,其中主要依赖的技术栈是 Apache Flink, 一款 Apache 基金会开源的流处理框架,平台的核心业务都会交给 Flink 去处理,其中包括离线批量任

项目--简单导出CSV文件

//导出 protected void BtnOutPut_Click(object sender, EventArgs e) { //角色 InitialRoles(); DataTable dt = DBClass.GetDataTable(string.Format(@"SELECT * FROM {0} Order By SN desc", View(Where))); StringWriter sw = new StringWriter(); //4S店不能看到总部价格等相关

Python-csv模块读写csv文件

import csv # 采用DictReader进行读写: # 读csv文件def get_data(self, from_file): test_data = [] with open(from_file, 'rb') as csv_file: csv.register_dialect('read', delimiter='\t', quoting=csv.QUOTE_NONE) reader = csv.DictReader(csv_file, dialect='read') for ro