我找到了一个类似于我试图实现的例子:
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
但是,我所拥有的值位于CSV文件中。
我需要将这些值插入到不同的容器中,然后将它们添加到unordered_map中,还是可以直接从文件中添加它们?
我正在努力解决这个问题,所以目前我只是将文件内容写到屏幕上:
int menuLoop = 1;
int userChoice;
string getInput;
while(menuLoop == 1)
{
cout << "Menu\n\n"
<< "1. 20\n"
<< "2. 100\n"
<< "3. 500\n"
<< "4. 1000\n"
<< "5. 10,000\n"
<< "6. 50,000\n\n";
cin >> userChoice;
if(userChoice == 1)
{
cout << "\n20\n\n";
string getContent;
ifstream openFile("20.txt");
if(openFile.is_open())
{
while(!openFile.eof())
{
getline(openFile, getContent);
cout << getContent << endl;
}
}
system("PAUSE");
}
}
文件内容:
Bpgvjdfj,Bvfbyfzc
Zjmvxouu,Fsmotsaa
Xocbwmnd,Fcdlnmhb
Fsmotsaa,Zexyegma
Bvfbyfzc,Qkignteu
Uysmwjdb,Wzujllbk
Fwhbryyz,Byoifnrp
Klqljfrk,Bpgvjdfj
Qkignteu,Wgqtalnh
Wgqtalnh,Coyuhnbx
Sgtgyldw,Fwhbryyz
Coyuhnbx,Zjmvxouu
Zvjxfwkx,Sgtgyldw
Czeagvnj,Uysmwjdb
Oljgjisa,Dffkuztu
Zexyegma,Zvjxfwkx
Fcdlnmhb,Klqljfrk
Wzujllbk,Oljgjisa
Byoifnrp,Czeagvnj
答案 0 :(得分:2)
要提取数据,请使用CSV解析器库或使用逗号作为分隔符手动拆分文件的每一行。 CSV文件与文本文件没有什么不同;他们只是遵循一种独特的数据格式。
不需要中间数据结构。假设您的数据采用[key],[value]
格式,请使用unordered_map here的C ++文档正确插入数据。
示例:
string line;
getline(file, line);
// simple split (alternatively, use strtok)
string key = line.substr(0,line.find(','));
string value = line.substr(line.find(',')+1);
unordered_map<string,string> mymap;
mymap[key] = value;
编辑:us2012的带有分隔符的getline方法也特别有用。另请注意,在使用分隔符作为数据读取CSV时必须注意,通常用引号括起来的值表示:
"hello, world","hola","mundo"
有关CSV格式的更多信息,请参见here。
答案 1 :(得分:2)
您可以在getline
中直接指定分隔符。
while(true)
{
string key, value;
//try to read key, if there is none, break
if (!getline(openFile, key, ',')) break;
//read value
getline(openFile, value, '\n');
mymap[key] = value;
cout << key << ":" << value << endl;
}
请注意,您当前的循环检查是否位于文件末尾并且将生成空键值对。以上更正了这一点。