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



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

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列开始阅读,输出将是"yysssysfs"。不过我不知道该怎么做。有人知道我能做什么吗?

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

这是一个使用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,gn"
"e,f,y,y,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,n,y,pn"
"e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,n,s,gn"
"e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,k,s,mn"
"e,x,y,n,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,k,y,gn"
"e,b,s,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,k,s,gn"
"e,x,f,g,f,n,f,c,n,g,e,e,s,s,w,w,p,w,o,p,n,y,un"
"e,b,s,y,t,l,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,gn";
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');
}
}

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

对于列中的字符列表,解决方案很简单。只需逐行读取(std::getline),并索引到该行列编号(在验证行确实当然足够长)。

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

如果这是一个措辞拙劣的家庭作业问题,而你保证1)每个字段只有一个字符,以及2)字段由一个逗号分隔,没有额外的白色空间,则可以将字段映射到列(2 * fieldId - 1给出列)。完成此操作后,您可以使用解决方案用于列中的字符。

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

最新更新