从逗号分隔的列表中提取值

时间:2010-12-16 04:38:38

标签: regex csv extract d

当给出一个逗号分隔值列表如3, asdf, *#, 1212.3时,我想提取这些值中的每一个,不包括逗号,所以我会有一个像[3, "asdf", "*#", 1212.3]这样的值列表(不是这样的文本表示,但作为一系列'命中')。我该怎么做?

4 个答案:

答案 0 :(得分:5)

我看到你正在使用D编程语言。这是指向CSV parser for D的链接。

答案 1 :(得分:2)

首先,如果您正在处理CSV文件,请不要使用正则表达式或您自己的解析器。基本上当你认为事情很简单时,他们确实不是,Stop Rolling Your Own CSV Parser

接下来,你说你想要一个数组([3,“asdf”,“*#”,1212.3])。这看起来是混合类型,不能用静态语言完成。即使使用std.variant,最终效率也很低。对于每个已解析的值,您将拥有如下代码:

try {
    auto data = to!double(parsedValue);
    auto data2 = to!int(data);
    if(data == data2)
        returnThis = Variant(data2);
    else
        returnThis = Variant(data);
} catch(ConvException ce) { }

现在,如果您的数据被某些已定义的字符集真正分隔,并且没有分成带有新行的记录,那么您可以使用std.algorithm中的split(“,”)。否则使用CSV解析器。如果您不想按照标准包装解析器,那么数据就是您想要的。在您的示例中,您有空格,CSV格式不应忽略这些空格,因此请在输出上调用strip()。

the article I linked中,它提到通常发生的事情是人们会以最简单的形式编写解析器而不处理更复杂的情况。所以,当你寻找一个CSV解析器时,你会发现许多只是不切割它。编写自己的解析器,我说可以处理所有有效的CSV文件。

幸运的是,你不需要自己编写,因为我习惯性地制作了CSV Parser for D。当前没有进行错误检查,我不知道报告问题的最佳方法,以便可以纠正并继续解析。用法示例可在unittest块中找到。您也可以解析结构:

struct MyData {
    int a;
    string b;
    string c;
    double d
}

foreach(data; csv.csv!MyData(str)) // I think I'll need to change the module/function name
    //...

答案 2 :(得分:1)

perl中,您可以执行以下操作:

@anArray = split(',', "A,B,C,D,E,F,G");

答案 3 :(得分:0)

(?:,|\s+)?([^ ,]+)应该这样做。 它跳过逗号或空格,然后选择除逗号或空格之外的任何内容。修改品尝。