首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用正则表达式的Scala CSV解析

不使用正则表达式的Scala CSV解析
EN

Stack Overflow用户
提问于 2021-09-13 23:58:25
回答 1查看 59关注 0票数 1

我正在为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)

有没有明显的方法可以做到这一点,而我没有呢?

EN

回答 1

Stack Overflow用户

发布于 2021-09-14 05:03:42

代码语言:javascript
复制
""""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数据有一个单引号或任意奇数个引号,则结果可能是不正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69170287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档