D:用逗号分隔字符串,但不引用字符串

时间:2015-12-17 14:19:43

标签: regex string d

我需要用逗号分割字符串,不引用如下: foo, bar, "hello, user", baz

得到:

foo
bar
hello, user
baz

3 个答案:

答案 0 :(得分:6)

使用std.csv

import std.csv;
import std.stdio;

void main()
{
    auto str = `foo,bar,"hello, user",baz`;

    foreach (row; csvReader(str))
    {
        writeln(row);
    }
}

应用程序输出:

["foo", "bar", "hello, user", "baz"]

请注意,我修改了您的CSV示例数据。由于std.csv之前的空格(),"无法正确解析它。

答案 1 :(得分:1)

您可以使用下一个代码段来完成此任务:

File fileContent;
string fileFullName = `D:\code\test\example.csv`;
fileContent = File (fileFullName, "r");

auto r = regex(`(?!\B"[^"]*),(?![^"]*"\B)`); 
foreach(line;fileContent.byLine)
  {
   auto result = split(line, r);
   writeln(result);
  }

答案 2 :(得分:0)

如果要解析特定的文件格式,则按行拆分并使用正则表达式通常是不正确的,尽管它在许多情况下都有效。我更喜欢逐个字符地阅读它,并为状态保留一些标志(或者在适当的情况下使用别人的功能为你做这种格式)。 D有std.csv:http://dlang.org/phobos/std_csv.html或我原来的旧csv.d这是最小的,但基本上也有效:https://github.com/adamdruppe/arsd/blob/master/csv.d(哈哈5年前是我最后一次改变它,但是,嘿,它仍然有效)

同样地,你可以使用正则表达式“解析”html ...有时候,但是在简单的情况下它很快就会破坏,你最好使用一个真正的html解析器(可能是用char来读取char!) )

回到引用的逗号,读取csv,例如,有一些引用内容的规则:首先,当然,逗号可以出现在引号内,而不会转到下一个字段。其次,换行也可以出现在引号内,而不会转到下一行!第三,连续两个引号字符是内容中的转义引号,而不是结束引号。

foo,bar
"this item has
two lines, a comma, and a "" mark!",this is just bar

我不确定如何用正则表达式来阅读(眼球,我很确定你的至少得到了错误的报价错误),但是一次读一个字符并不难做(我的小csv阅读器约50行,手工完成。与仅仅阅读字符相比,提前分割线条也很复杂,因为当您发现一端有结束报价时,您可能必须重新组合线条!然后你美丽的byLine循环突然不那么美丽。

此外,回顾以后,我发现简单的字符阅读器和命名函数比正则表达式更容易理解。

因此,您的答案对于您所询问的范围有限是正确的,但可能会忽略您实际尝试阅读的文件格式中其他案例的大局。

编辑:我想做的最后一件事,CSV中的这些角落案例是人们常说“不要重新发明轮子”的一个例子。并不是说它们真的很难处理 - 看看我的csv.d代码,它很简短,非常简单,并且可以处理我所抛出的所有东西 - 但这就是问题,不是吗? “我抛出的一切”。要处理文件格式,您需要了解角落的情况,以便您可以处理它们,至少如果您希望它是通用的并且可以进行任意用户输入。了解这些边缘情况往往更多地来自现实世界的经验,而不仅仅是快速浏览一下。一旦你了解它们,再次编写代码并不是非常难,你知道要测试什么!但如果你不了解它,你可以用数百个单元测试编写漂亮的代码......但是错过了真实世界的情况,你的用户碰巧尝试了一次它很重要。