Java代码如何读取和解析CSV文件呢?

书欣 Java经验 发布时间:2023-01-27 22:49:33 阅读数:11508 1
下文笔者讲述java代码读取和解析CSV文件的方法分享,如下所示

csv文件简介

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号)
  其文件以纯文本形式存储表格数据(数字和文本)
CSV文件格式的通用标准并不存在
  只是在RFC 4180中有基础性的描述 

csv文件示例

1,java265.com
2,java爱好者 

或
"1","java265.com"
"2","java爱好者"
注意事项:
   如果字符串中存在双引号,则需使用两个双引号表示
   "1","java""265.com" 

读取CSV文件的方法

方式1:
    使用逗号分隔的方式读取
方式2:
    使用opencsv读取csv文件

查看csv的示例

CSVReader.csv
package com.java265.csv;
 
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class CSVReader {
 
    public static void main(String[] args) {
 
        String csvFile = "/test/test.csv";
        BufferedReader br = null;
        String line = "";
        String cvssplitBy = ",";
 
        try {
 
            br = new BufferedReader(new FileReader(csvFile));
            while ((line = br.readLine()) != null) {
 
                // use comma as separator
                String[] test = line.split(cvsSplitBy);
 
                System.out.println("test [id= " + test[0] + " , info=" + test[1] + "]");
            }
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
    }
}

CSVUtils.java

package com.java265.utils;
 
import java.io.File;
import java.util.Arraylist;
import java.util.List;
import java.util.Scanner;
 
public class CSVUtils {
 
    private static final char DEFAULT_SEPARATOR = ',';
    private static final char DEFAULT_QUOTE = '"';
 
    public static void main(String[] args) throws Exception {
 
        String csvFile = "/test/test.csv";
 
        Scanner scanner = new Scanner(new File(csvFile));
        while (scanner.hasNext()) {
            List<String> line = parseLine(scanner.nextLine());
            System.out.println("Country [id= " + line.get(0) + ", code= " + line.get(1) + " , name=" + line.get(2) + "]");
        }
        scanner.close();
 
    }
 
    public static List<String> parseLine(String cvsLine) {
        return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE);
    }
 
    public static List<String> parseLine(String cvsLine, char separators) {
        return parseLine(cvsLine, separators, DEFAULT_QUOTE);
    }
 
    public static List<String> parseLine(String cvsLine, char separators, char customQuote) {
 
        List<String> result = new ArrayList<>();
 
        //if empty, return!
        if (cvsLine == null && cvsLine.isEmpty()) {
            return result;
        }
 
        if (customQuote == ' ') {
            customQuote = DEFAULT_QUOTE;
        }
 
        if (separators == ' ') {
            separators = DEFAULT_SEPARATOR;
        }
 
        StringBuffer curVal = new StringBuffer();
        boolean inQuotes = false;
        boolean startCollectChar = false;
        boolean doubleQuotesInColumn = false;
 
        char[] chars = cvsLine.toCharArray();
 
        for (char ch : chars) {
 
            if (inQuotes) {
                startCollectChar = true;
                if (ch == customQuote) {
                    inQuotes = false;
                    doubleQuotesInColumn = false;
                } else {
 
                    //Fixed : allow "" in custom quote enclosed
                    if (ch == '\"') {
                        if (!doubleQuotesInColumn) {
                            curVal.append(ch);
                            doubleQuotesInColumn = true;
                        }
                    } else {
                        curVal.append(ch);
                    }
 
                }
            } else {
                if (ch == customQuote) {
 
                    inQuotes = true;
 
                    //Fixed : allow "" in empty quote enclosed
                    if (chars[0] != '"' && customQuote == '\"') {
                        curVal.append('"');
                    }
 
                    //double quotes in column will hit this!
                    if (startCollectChar) {
                        curVal.append('"');
                    }
 
                } else if (ch == separators) {
 
                    result.add(curVal.toString());
 
                    curVal = new StringBuffer();
                    startCollectChar = false;
 
                } else if (ch == '\r') {
                    //ignore LF characters
                    continue;
                } else if (ch == '\n') {
                    //the end, break!
                    break;
                } else {
                    curVal.append(ch);
                }
            }
 
        }
 
        result.add(curVal.toString());
 
        return result;
    }
 
}

CSVUtilsTest.java

package com.java265.csv;
 
import com.java265.utils.CSVUtils;
import org.hamcrest.core.IsNull;
import org.junit.Test;
 
import java.util.List;
 
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
 
public class CSVUtilsTest {
 
    @Test
    public void test_no_quote() {
 
        String line = "10,AU,Australia";
        List<String> result = CSVUtils.parseLine(line);
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Australia"));
 
    }
 
    @Test
    public void test_no_quote_but_double_quotes_in_column() throws Exception {
 
        String line = "10,AU,Aus\"\"tralia";
 
        List<String> result = CSVUtils.parseLine(line);
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Aus\"tralia"));
 
    }
 
    @Test
    public void test_double_quotes() {
 
        String line = "\"10\",\"AU\",\"Australia\"";
        List<String> result = CSVUtils.parseLine(line);
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Australia"));
 
    }
 
    @Test
    public void test_double_quotes_but_double_quotes_in_column() {
 
        String line = "\"10\",\"AU\",\"Aus\"\"tralia\"";
        List<String> result = CSVUtils.parseLine(line);
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Aus\"tralia"));
 
    }
 
    @Test
    public void test_double_quotes_but_comma_in_column() {
 
        String line = "\"10\",\"AU\",\"Aus,tralia\"";
        List<String> result = CSVUtils.parseLine(line);
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Aus,tralia"));
 
    }
 
}

CSVUtilsTestCustom.java

package com.java265.csv;
 
import com.java265.utils.CSVUtils;
import org.hamcrest.core.IsNull;
import org.junit.Test;
 
import java.util.List;
 
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
 
public class CSVUtilsTestCustom {
 
    @Test
    public void test_custom_separator() {
 
        String line = "10|AU|Australia";
        List<String> result = CSVUtils.parseLine(line, '|');
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Australia"));
 
    }
 
    @Test
    public void test_custom_separator_and_quote() {
 
        String line = "'10'|'AU'|'Australia'";
        List<String> result = CSVUtils.parseLine(line, '|', '\'');
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Australia"));
 
    }
 
    @Test
    public void test_custom_separator_and_quote_but_custom_quote_in_column() {
 
        String line = "'10'|'AU'|'Aus|tralia'";
        List<String> result = CSVUtils.parseLine(line, '|', '\'');
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Aus|tralia"));
 
    }
 
    @Test
    public void test_custom_separator_and_quote_but_double_quotes_in_column() {
 
        String line = "'10'|'AU'|'Aus\"\"tralia'";
        List<String> result = CSVUtils.parseLine(line, '|', '\'');
 
        assertThat(result, IsNull.notNullValue());
        assertThat(result.size(), is(3));
        assertThat(result.get(0), is("10"));
        assertThat(result.get(1), is("AU"));
        assertThat(result.get(2), is("Aus\"tralia"));
 
    }
 
}

OpenCSV使用方法

pom.xml引入依赖
<dependency>
		<groupId>com.opencsv</groupId>
		<artifactId>opencsv</artifactId>
		<version>3.8</version>
	</dependency>

CSVReaderExample.java

package com.java265.csv;
import com.opencsv.CSVReader;
import java.io.FileReader;
import java.io.IOException;
public class CSVReaderExample {
    public static void main(String[] args) {
        String csvFile = "/Test/test.csv";
 
        CSVReader reader = null;
        try {
            reader = new CSVReader(new FileReader(csvFile));
            String[] line;
            while ((line = reader.readNext()) != null) {
                System.out.println("Country [id= " + line[0] + ", code= " + line[1] + " , name=" + line[2] + "]");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202301/16748310315537.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者