如何从数据集中读取特定的字符列

时间:2012-12-06 14:54:06

标签: c++ dataset char

我正在使用文本文件中的属性数据集,如下所示:

e,x,y,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g
e,f,y,y,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,n,y,p
e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,n,s,g
e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,k,s,m
e,x,y,n,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,k,y,g
e,b,s,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,k,s,g
e,x,f,g,f,n,f,c,n,g,e,e,s,s,w,w,p,w,o,p,n,y,u
e,b,s,y,t,l,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g

现在,我正在试图弄清楚如何轻松读取给定列中的字符。例如,如果我想从第3列读取,则输出将为“yyssysfs”。我无法弄清楚如何做到这一点。有谁知道我能做什么?

4 个答案:

答案 0 :(得分:1)

一次阅读每一行,可能删除逗号,然后输入std::vector。要获取第三列,只需遍历向量中的所有字符串,从字符串中获取第三列(如果删除了逗号)字符。

答案 1 :(得分:1)

这是使用iostream的黑暗内部的解决方案:

struct dataset_ctype : std::ctype<char>
{
  mask table[table_size];
public:
  dataset_ctype(size_t refs = 0) : std::ctype<char>(table, false, refs) {
    std::fill(table, table+table_size, (mask)alpha);
    table[','] = (mask)space;
  }
};

int main()
{
  std::string inp = 
    "e,x,y,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g\n"
    "e,f,y,y,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,n,y,p\n"
    "e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,n,s,g\n"
    "e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,k,s,m\n"
    "e,x,y,n,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,k,y,g\n"
    "e,b,s,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,k,s,g\n"
    "e,x,f,g,f,n,f,c,n,g,e,e,s,s,w,w,p,w,o,p,n,y,u\n"
    "e,b,s,y,t,l,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g\n";

  std::istringstream is(inp);
  is.imbue(std::locale(is.getloc(), new dataset_ctype));

  const int column = 2;
  while (is) {
    std::istream_iterator<std::string> ii(is);
    std::advance(ii, column);
    std::cout << *ii << '\n';
    is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  }
}

答案 2 :(得分:1)

您对列的定义究竟是什么。平时 定义,第三列中的字符列表将是 "xfbbxbxb"(以及第二列中的字符列表 将是",,,,,,,,")。你似乎想要的是列表 第三个字段中的字符

对于列中的字符列表,解决方案很简单。 只需逐行阅读(std::getline),并在该行中编入索引 使用列号(在验证该行确实存在之后) 当然,这已经足够了。)

对于字段中的字符列表,您必须打破每个字符 列入字段,可能将结果放入 std::vector<std::string>,然后索引到此向量。

如果这是一个措辞不好的家庭作业问题,那么你就是 保证1)每个字段只有一个字符,2) 字段由单个逗号分隔,没有其他白色 空格,然后您可以将字段映射到列(2 * fieldId - 1 给出了专栏)。完成此操作后,您可以使用该解决方案 对于列中的字符。

答案 3 :(得分:0)

使用std::ifstream打开该文件,然后使用while循环,其条件为std::getline(file,line),其中linestd::string。您可以计算字符在列号i中的行中的位置,因为它只是2 * i(如果第一列是i == 0)。要从该行获取该角色,只需使用std::string::operator[]即可。根本不需要解析这条线。然后将从每行得到的字符推送到std::vector<char>