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;
目录
相关文章
|
7月前
|
数据库
19、绕过去除注释符(Get)
19、绕过去除注释符(Get)
28 0
|
7月前
|
iOS开发
全局替换双斜杠(转义+反斜杠)为单斜杠
全局替换双斜杠(转义+反斜杠)为单斜杠
175 0
|
Java
避免分割字符串的常见错误:正则表达式元字符未转义
在编程和文本处理中,我们经常需要将一个字符串按照特定的分隔符拆分成多个部分。为了实现这一目标,我们使用分割函数或正则表达式来定义我们所需的分隔符。 在 Java 的 String 类的 split() 函数中,如果你使用字符串参数作为分隔符,例如 split(","),它会按照每个字符作为分隔符进行字符串拆分。
106 0
|
Unix Linux Windows
路径中的正斜杠/ 与反斜杠\
路径中的正斜杠/ 与反斜杠\
76 0
|
机器学习/深度学习 Shell C++
正则表达式普通字符、非打印字符、特殊字符、限定符的应用、定位符、元字符(规则,匹配,和实际使用)与运算符优先级
正则表达式普通字符、非打印字符、特殊字符、限定符的应用、定位符、元字符(规则,匹配,和实际使用)与运算符优先级
300 0
|
Shell Linux
shell中的单引号字符' 双引号字符" 反斜杠字符/ 反引号字符`
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。
正则匹配字符串反斜线的最后一部分
正则匹配字符串反斜线的最后一部分
136 0
正则匹配字符串反斜线的最后一部分
判断字符串是否有特殊字符和以0开头的正则表达式
判断字符串是否有特殊字符和以0开头的正则表达式
|
开发框架 Unix .NET
关于文件路径的反斜杠正斜杠和双斜杠问题
关于文件路径的反斜杠正斜杠和双斜杠问题
|
Android开发
安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
291 0