OpenCSV正确处理反斜线

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/79546866 OpenCSV正确处理反斜线2018.3.13版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/79546866

OpenCSV正确处理反斜线

  • 2018.3.13
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

OpenCSV是一个开源的、处理CSV数据的Java库。但它在处理反斜杠时存在一个小问题,本文讲述这个问题以及如何解决它。

OpenCSV的Maven依赖如下:

    <dependency>
        <groupId>com.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>4.1</version>
    </dependency>

问题

下面是使用OpenCSV编写的读取CSV数据的一个代码片段:

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
......
String dataValue = "test";
// writing  
StringWriter writer = new StringWriter();
try (CSVWriter csvwriter = new CSVWriter(writer)) {
    String[] originalData = new String[2];
    originalData[0] = dataValue;
    originalData[1] = dataValue;
    System.out.println("Original data: " + originalData[0] + "," + originalData[1]);
    csvwriter.writeNext(originalData);
} catch (IOException e) {
    throw new RuntimeException(e);
}
System.out.println("Written data: " + writer.toString());
// reading
try (CSVReader csvReader = new CSVReader(new StringReader(writer.toString()))) {
    String[] readData = csvReader.readNext();
    System.out.println("Read data: " + readData[0] + "," + readData[1]);
} catch (IOException e) {
    throw new RuntimeException(e);
}

上面的代码片段输出如下:

Original data: test,test
Written data: "test","test"

Read data: test,test

这是预期的结果。但是,如果在CSV数据中遇到反斜线字符(’\’),OpenCSV就会遇到问题。

假定dataValue带有反斜线字符:

String dataValue = "t\\est";

输出如下:

Original data: t\est,t\est
Written data: "t\est","t\est"

Read data: test,test

请注意,读取CSV数据中的反斜线字符消失了。

原因

默认情况下,CSVReader使用双反斜线(’\’)作为其转义字符。同时,CSVWriter使用双引号(’“’)作为转义字符。

因此,反斜线字符会导致不正确的转义。在读数据时,CSVParser将忽略单个反斜线字符,因为它是转义字符。

解决方案

默认情况下,CSVReader使用CSVParser解析CSV数据。OpenCSV还提供了一个严格遵循RFC4180标准的解析器:RFC4180Parser。

使用RFC4180Parser解析器,CSVReader会以双引号(’“’)作为转义字符,这样就可以与CSVWriter的转义方式保持一致。

故上面的代码片段可以修改如下:

// reading
RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
CSVReaderBuilder csvReaderBuilder = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(rfc4180Parser);
try (CSVReader csvReader = csvReaderBuilder.build()) {
    String[] readData = csvReader.readNext();
    System.out.println("Read data: " + readData[0] + "," + readData[1]);
} catch (IOException e) {
    throw new RuntimeException(e);
}

执行代码,输出:

Original data: t\est,t\est
Written data: "t\est","t\est"

Read data: t\est,t\est

补充一句,也可以选择Apache Commons CSV开源库,它也是很好的选择。

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
8月前
|
iOS开发
全局替换双斜杠(转义+反斜杠)为单斜杠
全局替换双斜杠(转义+反斜杠)为单斜杠
196 0
|
存储 数据采集
正确处理 CSV 文件的引号和逗号
CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便。但是你真的会处理 CSV 文件吗?数据包含引号或逗号,该怎么办?
811 0
如何去掉字符串开头,结尾或者中间的空格及其他不想要的字符
去掉文本字符串开头,结尾或者中间不想要的字符,比如空白。
|
8月前
|
Python Windows
python语法中错误的运算符或分隔符
【5月更文挑战第19天】python语法中错误的运算符或分隔符
83 1
|
8月前
|
Shell Perl
用sed如果原字符串或新字符串中包含特殊字符(如正斜杠/或其他特殊字符),需要用\进行转义
用sed如果原字符串或新字符串中包含特殊字符(如正斜杠/或其他特殊字符),需要用\进行转义
995 7
|
8月前
958. 字符类和字符匹配符
958. 字符类和字符匹配符
41 3
正则表达式重复元字符
正则表达式重复元字符
149 0
|
机器学习/深度学习 Shell C++
正则表达式普通字符、非打印字符、特殊字符、限定符的应用、定位符、元字符(规则,匹配,和实际使用)与运算符优先级
正则表达式普通字符、非打印字符、特殊字符、限定符的应用、定位符、元字符(规则,匹配,和实际使用)与运算符优先级
321 0
|
算法 Java C++
字符串,把这个碍眼的空格给我换掉!
字符串,把这个碍眼的空格给我换掉!
字符串,把这个碍眼的空格给我换掉!
正则匹配字符串反斜线的最后一部分
正则匹配字符串反斜线的最后一部分
151 0
正则匹配字符串反斜线的最后一部分