我正在为scala中的一个项目编写一个小型CSV解析器。该项目的规定不允许使用正则表达式或非官方的外部库。
我让它大部分正常工作,但是有一种情况给我带来了麻烦,那就是当CSV单元格中的数据包含逗号时。
我正在解析存储在CSV中的数据集。解析函数将字符串数组作为其唯一的参数,该数组表示从CSV中取出一行并调用split(",")。存储在CSV中的数据的格式是这样的:如果数据中有一个逗号,那么整个数据单元格会用引号("")括起来。问题是,当调用split(",")时,它在带引号的单元格中间拆分,因为它不知道忽略那个逗号。我需要一种忽略这个逗号的方法,本质上是“修复”参数数组
示例
假设在任何拆分发生之前,CSV中的一行看起来是这样的。
"Hello, everyone", green, blue, 5, 3.2
在split(",")之后,我们最终得到了
|"hello|everyone"|green|blue|5|3.2| // (Array length 6)
我需要它的地方
|"hello, everyone"|green|blue|5|3.2| //( Array length 5)
有没有明显的方法可以做到这一点,而我没有呢?
发布于 2021-09-14 05:03:42
""""Hello, everyone",green,blue,5,3.2""" //raw CSV
.split(",") //split at all commas
.foldRight((List[String](), false)){ //recombine quoted strings
case (str,(lst, false)) => (str :: lst, str.count(_ == '"')%2 > 0)
case (str,(hd::tl,true)) => (s"$str,$hd"::tl, str.count(_ == '"')%2 < 1)
}._1
.mkString("|") //reformat just to demonstrate success
//res0: String = "Hello, everyone"|green|blue|5|3.2注意:这里假设引号"是成对出现的。如果原始CSV数据有一个单引号或任意奇数个引号,则结果可能是不正确的。
https://stackoverflow.com/questions/69170287
复制相似问题