Java代码如何读取和解析CSV文件呢?
下文笔者讲述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();
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


