This commit is contained in:
Looly
2022-04-28 01:30:17 +08:00
parent e0ac5e9961
commit d78219c60c
248 changed files with 621 additions and 3407 deletions

View File

@@ -0,0 +1,63 @@
package cn.hutool.poi.csv;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import org.junit.Assert;
import org.junit.Test;
import java.io.StringReader;
public class CsvParserTest {
@Test
public void parseTest1() {
StringReader reader = StrUtil.getReader("aaa,b\"bba\",ccc");
CsvParser parser = new CsvParser(reader, null);
CsvRow row = parser.nextRow();
//noinspection ConstantConditions
Assert.assertEquals("b\"bba\"", row.getRawList().get(1));
IoUtil.close(parser);
}
@Test
public void parseTest2() {
StringReader reader = StrUtil.getReader("aaa,\"bba\"bbb,ccc");
CsvParser parser = new CsvParser(reader, null);
CsvRow row = parser.nextRow();
//noinspection ConstantConditions
Assert.assertEquals("\"bba\"bbb", row.getRawList().get(1));
IoUtil.close(parser);
}
@Test
public void parseTest3() {
StringReader reader = StrUtil.getReader("aaa,\"bba\",ccc");
CsvParser parser = new CsvParser(reader, null);
CsvRow row = parser.nextRow();
//noinspection ConstantConditions
Assert.assertEquals("bba", row.getRawList().get(1));
IoUtil.close(parser);
}
@Test
public void parseTest4() {
StringReader reader = StrUtil.getReader("aaa,\"\",ccc");
CsvParser parser = new CsvParser(reader, null);
CsvRow row = parser.nextRow();
//noinspection ConstantConditions
Assert.assertEquals("", row.getRawList().get(1));
IoUtil.close(parser);
}
@Test
public void parseEscapeTest(){
// https://datatracker.ietf.org/doc/html/rfc4180#section-2
// 第七条规则
StringReader reader = StrUtil.getReader("\"b\"\"bb\"");
CsvParser parser = new CsvParser(reader, null);
CsvRow row = parser.nextRow();
Assert.assertNotNull(row);
Assert.assertEquals(1, row.size());
Assert.assertEquals("b\"bb", row.get(0));
}
}

View File

@@ -0,0 +1,205 @@
package cn.hutool.poi.csv;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
import org.junit.Ignore;
import java.util.List;
import java.util.Map;
public class CsvReaderTest {
@Test
public void readTest() {
CsvReader reader = new CsvReader();
CsvData data = reader.read(ResourceUtil.getReader("test.csv", CharsetUtil.CHARSET_UTF_8));
Assert.assertEquals("sss,sss", data.getRow(0).get(0));
Assert.assertEquals(1, data.getRow(0).getOriginalLineNumber());
Assert.assertEquals("性别", data.getRow(0).get(2));
Assert.assertEquals("关注\"对象\"", data.getRow(0).get(3));
}
@Test
public void readMapListTest() {
final CsvReader reader = CsvUtil.getReader();
final List<Map<String, String>> result = reader.readMapList(
ResourceUtil.getUtf8Reader("test_bean.csv"));
Assert.assertEquals("张三", result.get(0).get("姓名"));
Assert.assertEquals("", result.get(0).get("gender"));
Assert.assertEquals("", result.get(0).get("focus"));
Assert.assertEquals("33", result.get(0).get("age"));
Assert.assertEquals("李四", result.get(1).get("姓名"));
Assert.assertEquals("", result.get(1).get("gender"));
Assert.assertEquals("好对象", result.get(1).get("focus"));
Assert.assertEquals("23", result.get(1).get("age"));
Assert.assertEquals("王妹妹", result.get(2).get("姓名"));
Assert.assertEquals("", result.get(2).get("gender"));
Assert.assertEquals("特别关注", result.get(2).get("focus"));
Assert.assertEquals("22", result.get(2).get("age"));
}
@Test
public void readAliasMapListTest() {
final CsvReadConfig csvReadConfig = CsvReadConfig.defaultConfig();
csvReadConfig.addHeaderAlias("姓名", "name");
final CsvReader reader = CsvUtil.getReader(csvReadConfig);
final List<Map<String, String>> result = reader.readMapList(
ResourceUtil.getUtf8Reader("test_bean.csv"));
Assert.assertEquals("张三", result.get(0).get("name"));
Assert.assertEquals("", result.get(0).get("gender"));
Assert.assertEquals("", result.get(0).get("focus"));
Assert.assertEquals("33", result.get(0).get("age"));
Assert.assertEquals("李四", result.get(1).get("name"));
Assert.assertEquals("", result.get(1).get("gender"));
Assert.assertEquals("好对象", result.get(1).get("focus"));
Assert.assertEquals("23", result.get(1).get("age"));
Assert.assertEquals("王妹妹", result.get(2).get("name"));
Assert.assertEquals("", result.get(2).get("gender"));
Assert.assertEquals("特别关注", result.get(2).get("focus"));
Assert.assertEquals("22", result.get(2).get("age"));
}
@Test
public void readBeanListTest() {
final CsvReader reader = CsvUtil.getReader();
final List<TestBean> result = reader.read(
ResourceUtil.getUtf8Reader("test_bean.csv"), TestBean.class);
Assert.assertEquals("张三", result.get(0).getName());
Assert.assertEquals("", result.get(0).getGender());
Assert.assertEquals("", result.get(0).getFocus());
Assert.assertEquals(Integer.valueOf(33), result.get(0).getAge());
Assert.assertEquals("李四", result.get(1).getName());
Assert.assertEquals("", result.get(1).getGender());
Assert.assertEquals("好对象", result.get(1).getFocus());
Assert.assertEquals(Integer.valueOf(23), result.get(1).getAge());
Assert.assertEquals("王妹妹", result.get(2).getName());
Assert.assertEquals("", result.get(2).getGender());
Assert.assertEquals("特别关注", result.get(2).getFocus());
Assert.assertEquals(Integer.valueOf(22), result.get(2).getAge());
}
@Data
private static class TestBean {
@Alias("姓名")
private String name;
private String gender;
private String focus;
private Integer age;
}
@Test
@Ignore
public void readTest2() {
final CsvReader reader = CsvUtil.getReader();
final CsvData read = reader.read(FileUtil.file("d:/test/test.csv"));
for (CsvRow strings : read) {
Console.log(strings);
}
}
@Test
@Ignore
public void readTest3() {
final CsvReadConfig csvReadConfig = CsvReadConfig.defaultConfig();
csvReadConfig.setContainsHeader(true);
final CsvReader reader = CsvUtil.getReader(csvReadConfig);
final CsvData read = reader.read(FileUtil.file("d:/test/ceshi.csv"));
for (CsvRow row : read) {
Console.log(row.getByName("案件ID"));
}
}
@Test
public void lineNoTest() {
CsvReader reader = new CsvReader();
CsvData data = reader.read(ResourceUtil.getReader("test_lines.csv", CharsetUtil.CHARSET_UTF_8));
Assert.assertEquals(1, data.getRow(0).getOriginalLineNumber());
Assert.assertEquals("a,b,c,d", CollUtil.join(data.getRow(0), ","));
Assert.assertEquals(4, data.getRow(2).getOriginalLineNumber());
Assert.assertEquals("q,w,e,r,我是一段\n带换行的内容",
CollUtil.join(data.getRow(2), ",").replace("\r", ""));
// 文件中第3行数据对应原始行号是6从0开始
Assert.assertEquals(6, data.getRow(3).getOriginalLineNumber());
Assert.assertEquals("a,s,d,f", CollUtil.join(data.getRow(3), ","));
}
@Test
public void lineLimitTest() {
// 从原始第2行开始读取
CsvReader reader = new CsvReader(CsvReadConfig.defaultConfig().setBeginLineNo(2));
CsvData data = reader.read(ResourceUtil.getReader("test_lines.csv", CharsetUtil.CHARSET_UTF_8));
Assert.assertEquals(2, data.getRow(0).getOriginalLineNumber());
Assert.assertEquals("1,2,3,4", CollUtil.join(data.getRow(0), ","));
Assert.assertEquals(4, data.getRow(1).getOriginalLineNumber());
Assert.assertEquals("q,w,e,r,我是一段\n带换行的内容",
CollUtil.join(data.getRow(1), ",").replace("\r", ""));
// 文件中第3行数据对应原始行号是6从0开始
Assert.assertEquals(6, data.getRow(2).getOriginalLineNumber());
Assert.assertEquals("a,s,d,f", CollUtil.join(data.getRow(2), ","));
}
@Test
public void lineLimitWithHeaderTest() {
// 从原始第2行开始读取
CsvReader reader = new CsvReader(CsvReadConfig.defaultConfig().setBeginLineNo(2).setContainsHeader(true));
CsvData data = reader.read(ResourceUtil.getReader("test_lines.csv", CharsetUtil.CHARSET_UTF_8));
Assert.assertEquals(4, data.getRow(0).getOriginalLineNumber());
Assert.assertEquals("q,w,e,r,我是一段\n带换行的内容",
CollUtil.join(data.getRow(0), ",").replace("\r", ""));
// 文件中第3行数据对应原始行号是6从0开始
Assert.assertEquals(6, data.getRow(1).getOriginalLineNumber());
Assert.assertEquals("a,s,d,f", CollUtil.join(data.getRow(1), ","));
}
@Test
public void customConfigTest() {
final CsvReader reader = CsvUtil.getReader(
CsvReadConfig.defaultConfig()
.setTextDelimiter('\'')
.setFieldSeparator(';'));
final CsvData csvRows = reader.readFromStr("123;456;'789;0'abc;");
final CsvRow row = csvRows.getRow(0);
Assert.assertEquals("123", row.get(0));
Assert.assertEquals("456", row.get(1));
Assert.assertEquals("'789;0'abc", row.get(2));
}
@Test
public void readDisableCommentTest() {
final CsvReader reader = CsvUtil.getReader(CsvReadConfig.defaultConfig().disableComment());
final CsvData read = reader.read(ResourceUtil.getUtf8Reader("test.csv"));
final CsvRow row = read.getRow(0);
Assert.assertEquals("# 这是一行注释,读取时应忽略", row.get(0));
}
@Test
@Ignore
public void streamTest() {
final CsvReader reader = CsvUtil.getReader(ResourceUtil.getUtf8Reader("test_bean.csv"));
reader.stream().limit(2).forEach(Console::log);
}
}

View File

@@ -0,0 +1,207 @@
package cn.hutool.poi.csv;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CsvUtilTest {
@Test
public void readTest() {
CsvReader reader = CsvUtil.getReader();
//从文件中读取CSV数据
CsvData data = reader.read(FileUtil.file("test.csv"));
List<CsvRow> rows = data.getRows();
final CsvRow row0 = rows.get(0);
Assert.assertEquals("sss,sss", row0.get(0));
Assert.assertEquals("姓名", row0.get(1));
Assert.assertEquals("性别", row0.get(2));
Assert.assertEquals("关注\"对象\"", row0.get(3));
Assert.assertEquals("年龄", row0.get(4));
Assert.assertEquals("", row0.get(5));
Assert.assertEquals("\"", row0.get(6));
}
@Test
public void readTest2() {
CsvReader reader = CsvUtil.getReader();
reader.read(FileUtil.getUtf8Reader("test.csv"), (csvRow)-> {
// 只有一行,所以直接判断
Assert.assertEquals("sss,sss", csvRow.get(0));
Assert.assertEquals("姓名", csvRow.get(1));
Assert.assertEquals("性别", csvRow.get(2));
Assert.assertEquals("关注\"对象\"", csvRow.get(3));
Assert.assertEquals("年龄", csvRow.get(4));
Assert.assertEquals("", csvRow.get(5));
Assert.assertEquals("\"", csvRow.get(6));
});
}
@Test
@Ignore
public void readTest3() {
CsvReader reader = CsvUtil.getReader();
String path = FileUtil.isWindows() ? "d:/test/test.csv" : "~/test/test.csv";
reader.read(FileUtil.getUtf8Reader(path), Console::log);
}
@Test
public void readCsvStr1(){
CsvData data = CsvUtil.getReader().readFromStr("# 这是一行注释,读取时应忽略\n" +
"\"sss,sss\",姓名,\"性别\",关注\"对象\",年龄,\"\",\"\"\"\n");
List<CsvRow> rows = data.getRows();
final CsvRow row0 = rows.get(0);
Assert.assertEquals("sss,sss", row0.get(0));
Assert.assertEquals("姓名", row0.get(1));
Assert.assertEquals("性别", row0.get(2));
Assert.assertEquals("关注\"对象\"", row0.get(3));
Assert.assertEquals("年龄", row0.get(4));
Assert.assertEquals("", row0.get(5));
Assert.assertEquals("\"", row0.get(6));
}
@Test
public void readCsvStr2(){
CsvUtil.getReader().readFromStr("# 这是一行注释,读取时应忽略\n" +
"\"sss,sss\",姓名,\"性别\",关注\"对象\",年龄,\"\",\"\"\"\n",(csvRow)-> {
// 只有一行,所以直接判断
Assert.assertEquals("sss,sss", csvRow.get(0));
Assert.assertEquals("姓名", csvRow.get(1));
Assert.assertEquals("性别", csvRow.get(2));
Assert.assertEquals("关注\"对象\"", csvRow.get(3));
Assert.assertEquals("年龄", csvRow.get(4));
Assert.assertEquals("", csvRow.get(5));
Assert.assertEquals("\"", csvRow.get(6));
});
}
@Test
@Ignore
public void writeTest() {
String path = FileUtil.isWindows() ? "d:/test/testWrite.csv" : "~/test/testWrite.csv";
CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8);
writer.write(
new String[] {"a1", "b1", "c1", "123345346456745756756785656"},
new String[] {"a2", "b2", "c2"},
new String[] {"a3", "b3", "c3"}
);
}
@Test
@Ignore
public void writeBeansTest() {
@Data
class Student {
Integer id;
String name;
Integer age;
}
String path = FileUtil.isWindows() ? "d:/test/testWriteBeans.csv" : "~/test/testWriteBeans.csv";
CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8);
List<Student> students = new ArrayList<>();
Student student1 = new Student();
student1.setId(1);
student1.setName("张三");
student1.setAge(18);
Student student2 = new Student();
student2.setId(2);
student2.setName("李四");
student2.setAge(22);
Student student3 = new Student();
student3.setId(3);
student3.setName("王五");
student3.setAge(31);
students.add(student1);
students.add(student2);
students.add(student3);
writer.writeBeans(students);
writer.close();
}
@Test
@Ignore
public void readLfTest(){
final CsvReader reader = CsvUtil.getReader();
String path = FileUtil.isWindows() ? "d:/test/rw_test.csv" : "~/test/rw_test.csv";
final CsvData read = reader.read(FileUtil.file(path));
for (CsvRow row : read) {
Console.log(row);
}
}
@Test
@Ignore
public void writeWrapTest(){
List<List<Object>> resultList=new ArrayList<>();
List<Object> list =new ArrayList<>();
list.add("\"name\"");
list.add("\"code\"");
resultList.add(list);
list =new ArrayList<>();
list.add("\"wang\"");
list.add(1);
resultList.add(list);
String path = FileUtil.isWindows() ? "d:/test/csvWrapTest.csv" : "~/test/csvWrapTest.csv";
final CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8);
writer.write(resultList);
}
@Test
@Ignore
public void writeDataTest(){
@Data
@AllArgsConstructor
class User {
Integer userId;
String username;
String mobile;
}
List<String> header = ListUtil.of("用户id", "用户名", "手机号");
List<CsvRow> row = new ArrayList<>();
List<User> datas = new ArrayList<>();
datas.add(new User(1, "张三", "18800001111"));
datas.add(new User(2, "李四", "18800001112"));
datas.add(new User(3, "王五", "18800001113"));
datas.add(new User(4, "赵六", "18800001114"));
//可以为null
//Map<String, Integer> headMap = null;
Map<String, Integer> headMap = new HashMap<>();
headMap.put("userId", 0);
headMap.put("username", 1);
headMap.put("mobile", 2);
for (User user : datas) {
// row.size() + 1, 表示从第2行开始第一行是标题栏
row.add(new CsvRow(row.size() + 1, headMap,
BeanUtil.beanToMap(user).values().stream().map(Object::toString).collect(Collectors.toList())));
}
CsvData csvData = new CsvData(header, row);
String path = FileUtil.isWindows() ? "d:/test/csvWriteDataTest.csv" : "~/test/csvWriteDataTest.csv";
final CsvWriter writer = CsvUtil.getWriter(path, CharsetUtil.CHARSET_UTF_8);
writer.write(csvData);
}
}

View File

@@ -0,0 +1,47 @@
package cn.hutool.poi.csv;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.CharsetUtil;
import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CsvWriterTest {
@Test
@Ignore
public void writeWithAliasTest(){
final CsvWriteConfig csvWriteConfig = CsvWriteConfig.defaultConfig()
.addHeaderAlias("name", "姓名")
.addHeaderAlias("gender", "性别");
final CsvWriter writer = CsvUtil.getWriter(
FileUtil.file("d:/test/csvAliasTest.csv"),
CharsetUtil.CHARSET_GBK, false, csvWriteConfig);
writer.writeHeaderLine("name", "gender", "address");
writer.writeLine("张三", "", "XX市XX区");
writer.writeLine("李四", "", "XX市XX区,01号");
writer.close();
}
@Test
@Ignore
public void issue2255Test(){
String fileName = "D:/test/" + new Random().nextInt(100) + "-a.csv";
CsvWriter writer = CsvUtil.getWriter(fileName, CharsetUtil.CHARSET_UTF_8);
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(i+"");
}
Console.log("{} : {}", fileName, list.size());
for (String s : list) {
writer.writeLine(s);
}
writer.close();
}
}