2

我正在处理一个文本文件中的属性数据集,它看起来像这样:

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

4 回答 4

1

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

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');
  }
}
于 2012-12-06T15:02:32.537 回答
1

确切地说,您对列的定义是什么。根据通常的定义,第三列中的字符列表将是 "xfbbxbxb"(并且第二列中的字符列表将是",,,,,,,,")。您似乎想要的是第三个字段中的字符列表。

对于列中的字符列表,解决方案很简单。只需逐行读取std::getline

对于字段中的字符列表,您必须将每一行分解为字段,可能将结果放入 std::vector<std::string>中,然后索引到该向量中。

如果这是一个措辞不佳的作业问题,并且您可以保证 1) 每个字段只有一个字符,并且 2) 字段由单个逗号分隔,没有额外的空格,那么您可以将字段映射到列(2 * fieldId - 1 给出柱子)。完成此操作后,您可以将解决方案用于列中的字符。

于 2012-12-06T15:29:15.607 回答
1

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

于 2012-12-06T14:57:36.353 回答
0

用于std::ifstream打开文件,然后有一个条件为的while循环std::getline(file,line),其中. 您可以从列号 中计算出字符在行中的哪个位置,就像是(如果第一列是)。要从行中获取该字符,只需使用. 根本不需要解析该行。然后将你从每一行得到的字符推入一个.linestd::stringi2 * ii == 0std::string::operator[]std::vector<char>

于 2012-12-06T15:02:36.250 回答