From 41480c8ee527351c150982e409c3b5c52ad08895 Mon Sep 17 00:00:00 2001 From: devzhi Date: Tue, 10 Aug 2021 14:56:03 +0800 Subject: [PATCH] =?UTF-8?q?CsvUtils=E5=A2=9E=E5=8A=A0=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/text/csv/CsvBaseReader.java | 37 +++++++++++++++++++ .../cn/hutool/core/text/csv/CsvUtilTest.java | 30 +++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java index f41987037..5cbb24f53 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.ObjectUtil; import java.io.File; import java.io.Reader; import java.io.Serializable; +import java.io.StringReader; import java.nio.charset.Charset; import java.nio.file.Path; import java.util.ArrayList; @@ -108,6 +109,25 @@ public class CsvBaseReader implements Serializable { return read(file, DEFAULT_CHARSET); } + /** + * 从字符串中读取CSV数据 + * @param csvStr CSV字符串 + * @return {@link CsvData},包含数据列表和行信息 + */ + public CsvData read(String csvStr){ + return read(new StringReader(csvStr)); + } + + /** + * 从字符串中读取CSV数据 + * @param csvStr CSV字符串 + * @param rowHandler 行处理器,用于一行一行的处理数据 + */ + public void read(String csvStr, CsvRowHandler rowHandler){ + read(parse(new StringReader(csvStr)), rowHandler); + } + + /** * 读取CSV文件 * @@ -195,6 +215,23 @@ public class CsvBaseReader implements Serializable { return result; } + /** + * 从字符串中读取CSV数据并转换为Bean列表,读取后关闭Reader。
+ * 此方法默认识别首行为标题行。 + * @param Bean类型 + * @param csvStr csv字符串 + * @param clazz Bean类型 + * @return Bean列表 + */ + public List read(String csvStr,Class clazz){ + // 此方法必须包含标题 + this.config.setContainsHeader(true); + + final List result = new ArrayList<>(); + read(new StringReader(csvStr), (row) -> result.add(row.toBean(clazz))); + return result; + } + /** * 从Reader中读取CSV数据,读取后关闭Reader * diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java index 10445a0cf..0a90ed3bc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java @@ -58,6 +58,36 @@ public class CsvUtilTest { reader.read(FileUtil.getUtf8Reader(path), Console::log); } + @Test + public void readCsvStr1(){ + CsvData data = CsvUtil.getReader().read("# 这是一行注释,读取时应忽略\n" + + "\"sss,sss\",姓名,\"性别\",关注\"对象\",年龄,\"\",\"\"\"\n"); + List 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().read("# 这是一行注释,读取时应忽略\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() {