在引号内的逗号不考虑,将文本按逗号分割。

3

有没有办法在Scala中使用split函数,使其在逗号处分割一行文本,但不在两个双引号内的逗号处分割?

例如,我有以下文本:

x: String = """"??", "hamburger", "ketchup, mayo, mustard", "pizza""""

我尝试了这个方法:x.split(',') ,但是它不起作用。然后,我考虑删除所有双引号,但这仍然不能解决我的问题。

非常感谢您的帮助!

编辑:

以下是我的代码片段,看看我如何将其结合使用:

val data1 = noheader1.map { line =>
  val values = line._1.split(',') //This is what I am trying to change
  val name = values(2).replaceAll("\"", ""))

我对 Scala 和正则表达式都不是很熟悉,所以能否有人明确一下如何在我的代码中编写那个奇怪的正则表达式,以便我可以获得一行逗号分隔单词的数组?


2
我建议你将该行解析为逗号分隔的CSV格式! - Sabuj Hassan
只是为了明确起见:如@SabujHassan所建议的那样,使用CSV解析器,如果解析器遵守RFC4180,特别是第2.6节,逗号将不会成为问题。 - KeyNone
嘿,大家好,感谢你们的建议。对于Mike来说,x来自我从一个巨大的数据集中解析出来的RDD行,并且一些值是日语,所以它们显示为“?”。“?” - Kevin Zakka
3个回答

4

试一下这个!

(?>"(?>\\.|[^"])*?"|(,))

Regex101


0

你可以使用正则表达式和findAllIn()代替split(),例如:

 val x = """"??", "hamburger", "ketchup, mayo, mustard", "pizza""""
 """"[^"]+"""".r.findAllIn(x).toList

这将导致List("??", "汉堡包", "番茄酱,蛋黄酱,芥末酱", "比萨")

注意:在示例中我使用了三引号(""")。


0

也许不像其他已经提出的正则表达式那样优雅,考虑将项目之间的分隔元素视为", ",因此

x.split("\",\\s+\"")
Array("??, hamburger, ketchup, mayo, mustard, pizza")

然后在结果数组中,对于head"??"应用stripPrefix("\""),并对lastpizza"应用stripSuffix("\"")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接