正则表达式模式从CSV文件中提取空字段

时间:2016-01-29 13:24:08

标签: c++11 visual-c++

我有一个需要读入Matrix的csv文件。 现在我有正则表达式

regex pat { R"(("[^"]+")|([^,]+))" }

我在stackoverflow中找到了类似的主题,但是要么使用了不同的正则表达式模式,要么使用了c ++以外的语言。 现在它选择引号之间的序列和非逗号之间的任何序列。该文件包含来自调查的数据,其中有问题,是没有答案。如果您回答“否”,则无需回答某些相关问题。 因此我在文件中得到一些序列:“:,,,,,,,,”每两个逗号表示一个空字段。但我想保持这一行作为一个编号相同的数组。似乎以后导航矩阵以获取信息会更容易。所以我必须在逗号之间提取这些空字段。 我找不到空序列的正则表达式模式。正则表达式是解决这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:1)

此代码说明了命名模式的示例用法:

#include <iostream>
#include <iterator>
#include <string>
#include <regex>

int main()
{
  std::regex field_regex("(\"([^\"]*)\"|([^,]*))(,|$)");

  for (const std::string s : {
      "a,,hello,,o",
      "\"a\",,\"hello\",,\"o\"",
      ",,,,"})
  {
    std::cout << "parsing: " << s << "\n";
    std::cout << "======================================" << "\n";
    auto i = 0;
    for (auto it = std::sregex_iterator(s.begin(), s.end(), field_regex);
        it != std::sregex_iterator();
        ++it, ++i)
    {
      auto match = *it;
      auto extracted = match[2].length() ? match[2].str() : match[3].str();
      std::cout << "column[" << i << "]: " << extracted << "\n";
      if (match[4].length() == 0)
      {
        break;
      }
    }
    std::cout << "\n";
  }
}

输出:

parsing: a,,hello,,o
======================================
column[0]: a
column[1]: 
column[2]: hello
column[3]: 
column[4]: o

parsing: "a",,"hello",,"o"
======================================
column[0]: a
column[1]: 
column[2]: hello
column[3]: 
column[4]: o

parsing: ,,,,
======================================
column[0]: 
column[1]: 
column[2]: 
column[3]: 
column[4]: