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() {