From f4d67ede39d4c09bff8fbdde57bac980e663181e Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 1 Jul 2024 15:59:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D\n#=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E5=8F=8C=E5=BC=95=E5=8F=B7=E4=B8=AD=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- .../cn/hutool/core/text/csv/CsvParser.java | 3 +- .../hutool/core/text/csv/IssueIA8WE0Test.java | 30 +++++++++++++++++++ .../src/test/resources/issueIA8WE0.csv | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/text/csv/IssueIA8WE0Test.java create mode 100644 hutool-core/src/test/resources/issueIA8WE0.csv diff --git a/CHANGELOG.md b/CHANGELOG.md index 306586d20..1aff6a9a8 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.29(2024-06-30) +# 5.8.29(2024-07-01) ### 🐣新特性 * 【core 】 DateUtil增加offsetYear方法 @@ -27,6 +27,7 @@ * 【http 】 修复Mac下的微信浏览器被识别为移动端问题(issue#IA74K2@Gitee) * 【core 】 修复Tailer指定初始读取行数的计算错误问题(issue#IA77ML@Gitee) * 【http 】 修复getFileNameFromDisposition获取头错误问题(issue#3632@Github) +* 【core 】 修复\n#出现在双引号中解析错误问题(issue#IA8WE0@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.28(2024-05-29) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java index 46cd9e3c1..48957ade5 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java @@ -240,7 +240,8 @@ public final class CsvParser extends ComputeIter implements Closeable, S if(preChar < 0 || preChar == CharUtil.CR || preChar == CharUtil.LF){ // 判断行首字符为指定注释字符的注释开始,直到遇到换行符 // 行首分两种,1是preChar < 0表示文本开始,2是换行符后紧跟就是下一行的开始 - if(null != this.config.commentCharacter && c == this.config.commentCharacter){ + // issue#IA8WE0 如果注释符出现在包装符内,被认为是普通字符 + if((false == inQuotes) && null != this.config.commentCharacter && c == this.config.commentCharacter){ inComment = true; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/IssueIA8WE0Test.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/IssueIA8WE0Test.java new file mode 100644 index 000000000..82ae14dbf --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/IssueIA8WE0Test.java @@ -0,0 +1,30 @@ +package cn.hutool.core.text.csv; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; + +/** + * https://gitee.com/dromara/hutool/issues/IA8WE0 + */ +public class IssueIA8WE0Test { + @Test + public void csvReadTest() { + final CsvReader csvReader = new CsvReader(); + final CsvData read = csvReader.read(FileUtil.file("issueIA8WE0.csv")); + final List rows = read.getRows(); + + assertEquals(1, rows.size()); + assertEquals(3, rows.get(0).size()); + assertEquals("c1_text1", rows.get(0).get(0)); + // 如果\n#出现在双引号中,表示实际的文本内容,并不算注释 + assertEquals("c1_text2\n#c1_text2_line2", rows.get(0).get(1)); + assertEquals("c1_text3", rows.get(0).get(2)); + + IoUtil.close(csvReader); + } +} diff --git a/hutool-core/src/test/resources/issueIA8WE0.csv b/hutool-core/src/test/resources/issueIA8WE0.csv new file mode 100644 index 000000000..92b21f397 --- /dev/null +++ b/hutool-core/src/test/resources/issueIA8WE0.csv @@ -0,0 +1,2 @@ +c1_text1,"c1_text2 +#c1_text2_line2",c1_text3