通过排除双引号内的逗号拆分字符串

Split a string by Comma by excluding the ones inside Double Quotes

我特别有这个字符串:

123,abc,true,true,true,false,true,false,false,false,123,"my name is : something('Jack'), email is 'abc@gmail.com' is already provided. The company's policy 'xyz', is beneficial.",ABCD,591633,1

我想通过排除双引号内的逗号来用逗号分隔字符串。所以我在这里尝试生成的输出是

[123, abc, true, true, true, false, true, false, false, false, 123, "my name is : something('Jack') email is 'abc@gmail.com' is already provided. The company's policy 'xyz' is beneficial.", ABCD, 591633, 1]

我试过使用其他 Whosebug post 的答案,但它们不适用于此类字符串。谁能帮我实现这个目标?

我正在尝试在 Kotlin 中实现它。

我能想到的一种方法是,先去掉双引号内的逗号,然后用逗号分隔字符串,但无法得到预期的结果。

我通过以下更改得到了它

file.nextLine()
.replace(",(?=[^\"]*\"[^\"]*(?:\"[^\"]*\"[^\"]*)*$)".toRegex(), "")
.split(",")

将引号内的逗号替换为“”,并使用分隔符逗号分隔字符串。

这给了我预期的输出:-)

但不推荐

由于您正在尝试解析 CSV 文件,因此使用现有库几乎总是比编写自己的代码好得多。优势包括:

  • 它可以处理您没有时间了解或支持的所有极端情况和微妙之处。例如,如果 double-quote 字符本身被引用会怎样?如果分隔符是分号或制表符或 space 或逗号以外的其他内容怎么办? (是的,它仍然被称为 CSV,令人困惑。例如,Excel 在一些以逗号作为小数点分隔符的区域中写分号。)关于 headers、line-breaks、注释行,空行,转义序列?你能处理和测试不同程序编写的 CSV 的所有不同方言吗?
  • 经过全面测试,无数用户证明。
  • 它会在标准更改、发现错误或可以改进性能时更新。
  • 它很常用,因此其他开发人员可能熟悉它。

一个例子是 Apache Commons CSV,它是免费的,open-source,并且很容易包含在任何 Maven 或 Gradle 项目中。

var str = '"Foo","Bar, baz","Lorem","Ipsum"',
    res = str.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);

console.log(res);  // [ '"Foo"', '"Bar, baz"', '"Lorem"', '"Ipsum"' ]