2017-04-21 42 views
0

我有一个CSV分隔符和以下正则表达式,用逗号分割字符串。从逗号分割时逃离英寸符号

String[] splitData = splitCSV.split(",(?=(?:[^\"]*\"[^\"]*\"^\")*[^\"]*$)"); 

它的工作原理至今弦乐像123, "foo", "bar", "no, split, here"但是当它遇到英寸符号(“),如下面的它不能做的分裂。

"123, 1.0" xyz" 

我需要它分成1231.0" xyz

希望有人能为此提供解决方案。谢谢。

+0

你能提供一些数据吗? – Rahul

+0

@Sajirupee:可能因为英寸分隔字符串。身份证使用这些'''英寸?并且Id想知道该程序是否可以编译,并且请显示您获得的输出。 – user7185318

+0

您没有向我们展示第一个输入字符串的预期输出。 – revo

回答

2

这里有几点意见:

  1. 您应该使用现有的CSV处理库,而不是使用正则表达式创建自己的CSV处理库。有很多Java可用,请参阅this question作为起点。这是一个解决的问题;没有理由重新创造它。
  2. 您提到的情况将是无效*数据。报价应该在一个字符串中转义,通常使用两个引号。有一个非转义报价使得文件无效;而且一旦出现这类错误,通常没有可靠的方法来告诉文件“应该”。该怎么办:

    • 如果该文件在您的控制范围内,请进行更正。在字符串中使用标准转义格式作为引号。
    • 如果该文件不在您的控制范围内,则应该单独处理错误,而不是将其包括在核心处理中。对文件进行预处理以查找错误,或者使用CSV库中的可用错误处理对具有不正确格式的行进行操作。如果错误仅限于您提前知道的可预见问题,您可能可以纠正它们。但是在大多数情况下,这样的错误会导致你不得不拒绝这些行。

*技术上不存在CSV标准,所以任何事情都会发生。但是,这将是任何合理格式的数据错误。在现实世界中,这几乎总是会发生,因为有人没有考虑过文件格​​式,也不是因为他们故意以这种方式进行计划。

+0

谢谢你的帮助。使用Apache常见的csv库。它解决了我的问题,没有任何麻烦。 – Sajirupee

1

这里有什么是CSV的不寻常的方言。

虽然为CSV没有正式的标准,有广泛的两种方法来报价:

  1. 行情并不特殊。即:7" single, 12" album是两项:7" single12" album。在这种方言中,含有,的物品存在问题。
  2. 行情很特别。即:"you, me","me you"是两项:you, meme, you。在这种方言中,您可以在条目周围添加引号,以便在条目中有,。但是,它会使包含"的项目出现问题,就像您发现的那样。

典型的回答在第二种方法的"问题,是逃生报价。所以项目7" single将在CSV中显示为"7\" single"。这当然意味着\成为一个问题,但这很容易以同样的方式解决。 AC\DC 7" single在CSV中显示为"AC\\DC 7\" single"

如果您可以采用这些传统方法之一,那就这样做。然后,您可以使用现有的CSV库,也可以推出自己的CSV库。尽管正则表达式可以使用这些格式,但我的观点是,它不是编写代码以使用CSV的最清晰的方式:我发现更清晰的状态机(例如switch (state)语句)很好,很清晰。

如果你不能改变你的输入格式,你必须解决的难题是,当你遇到一个"时,它是一个元字符(围绕一个项目的一对引号的一部分)还是真实的字符项目的一部分?

作为格式的所有者,由您决定规则是什么。也许"只应该被认为是一个元字符,如果它旁边,

"A Town Called Malice", The Jam, 7", £6.99 

所以,你必须拿出自己的规则,即工作您的域,并明确写代码来处理这种情况:但是,即使你让报价,不带引号的物品的混合物引起的问题。一种方法是将输入预处理为规范化的CSV,以便它再次适用于传统的CSV分析器。