使用数字序列分割字符串行(Scala)

f8rj6qna  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(78)

我从Salesforce查询中得到了一个格式不好的字符串,它应该是CSV,并带有我选择的字符串,但是API调用没有为行或行项目提供很多健康的分隔符。唯一的行选择是LF或CRLF。但是,我知道第一列是一个数字(8位数),每行也以"结束/开始。
因此,我正在寻找一种方法来分割行与double_quote,CR,LF,double_quote,8位数,同时保持8位数。(我可以失去引号。)
举例来说:

val lineSep = Seq('"', '\r','\n', '"').mkString
 
// desired lines returned
val a = Array(
    "\"09994931\"`\"abc\"\r\n\"def\"", // desired line with end quote gone
    "\"09994932\"`\"lmn\"\r\n\"poq\"", // desired line with first / end quote gone
    "\"09994933\"`\"uvw\"\r\n\"xyz\""  // desired line with first quote gone
)
val blob = a.mkString("\r\n")
blob.split(lineSep).foreach(x => println("**"+x+"**"))

字符串
返回6行而不是3行:

**"09994931"`"abc**
**def**
**09994932"`"lmn**
**poq**
**09994933"`"uvw**
**xyz"**


因为我稍后会在""`上拆分行.所以我可以在行的末尾缺少一个引号,并在第一行的开头和最后一行的结尾处多加一个引号。
我知道有一些lookahead / behind选项,但我还没有确定一种方法来适应那些表示8位数的方法。
我认为这样的代码将是一个起点,但它不太正确-因为它不工作,我不确定是否要向前看或向后看,并占8位数了。

blob.split("""((?=\"\r\n\"d{0,9}>)|(?<=\"\r\n\"\d{0,9}>))""")


注意:为了避免混淆,我的大多数,有一个标题,我不提供,不应该问题,如果数字包括在内。

qlckcl4x

qlckcl4x1#

与其将换行符也放入Assert,您可以创建一个没有交替的模式,在匹配一个换行符时进行分割,然后使用一个正向前瞻Assert(?=来Assert双引号之间的8位数。
请注意,模式中的>字符不应该存在,d也应该是\d
如果你把字符串放在三重引号之间,你不必转义\",你也可以使用\R来代替\r\n

blob.split("""\r?\n(?="\d{8}")""").foreach(x => println("**"+x+"**"))

字符串
输出

**"09994931"`"abc"
"def"**
**"09994932"`"lmn"
"poq"**
**"09994933"`"uvw"
"xyz"**


参见Scala demoregex demo

相关问题