一次性读取 GZIP 压缩的 CSV 文件

Wu Jun 2019-12-25 15:59:03
Categories: > Tags:

1 读取文件

先获取文件 InputStream,以 url 为例

URL url = new URL(destUrl);
HttpURLConnection httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
InputStream inputStream = httpUrl.getInputStream();

2 解压 GZIP 文件

使用 java.util.zip 包的 GZIPInputStream 可以解压 GZIP 文件。只需先获取待解压的 InputStream,然后再 new 一个 GZIPInputStream 对象,就可以获得解压后的 InputStream

GZIPInputStream bis = new GZIPInputStream(inputStream);

3 InputStream 转 Reader

获取 InputStream 后,如果还要对他进行下一步操作,可以直接对其读取,不用先存成文件再从文件读。

InputStreamReader isr = new InputStreamReader(bis);

4 读取 csv

使用 org.apache.commons.csv 解析 csv 文件

pom 依赖

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.5</version>
        </dependency>

先定义表头数组,方便之后按表头取值

static final String[] FILE_HEADER = new String[]{"date", "file_id", ……};

新建 CSVFormat,加上 withSkipHeaderRecord() 以免将第一行表头也当作数据读取了

CSVFormat format = CSVFormat.DEFAULT.withHeader(FILE_HEADER).withSkipHeaderRecord();

format.parse 将 Reader 里的数据转换为 CSVRecord

Iterable<CSVRecord> records = format.parse(isr);

迭代 CSVRecord 通过 get 表头取值

for (CSVRecord record : records) {
    String fileId =  record.get("file_id");
    ……
}