我有一个可以成功读取CSV文件的程序。所述CSV文件是由3列分隔的列表。并且每列在每行之间都有逗号。例如
第1行---艺术家,流派,歌曲 第2行---迈克尔杰克逊,波普,惊悚片
等等。我希望我的程序要做的是阅读第一行并获取艺术家,流派和歌曲,将这些作为选项打印给用户。例如
“选择一个选项” 1.艺术家 2.类型 3.歌曲
然后当他们选择一个选项时,它会显示CSV文件中的所有艺术家,歌曲或流派。
到目前为止,我的程序正在读取CSV并将每行放入向量中。到目前为止,这是我的代码......
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
ifstream infile("music_list.csv");
string line = "";
vector<string> all_words;
cout << "Hello";
while (getline(infile, line))
{
stringstream strstr(line);
string word = "";
while (getline(strstr,word, ','))
{
all_words.push_back(word);
}
for (unsigned i = 0; i < all_words.size(); i++)
{
cout << all_words.at(i)<< "\n";
}
}
system("pause");
return 0;
}
我只是弄清楚如何让它读取第一行,将第一行中已经用逗号分隔的每个字符串分开,然后将其作为选项输出给用户。所以从本质上讲,我可以在CSV文件中将艺术家,流派,歌曲改为开胃菜,菜肴,饮料等。
答案 0 :(得分:1)
首先,您必须阅读csv文件并将行存储在向量中,您可以使用此函数来执行此操作。
vector<string> readCsvFileContent(const string file)
{
vector<string> buffer;
ifstream configFile;
configFile.exceptions(ifstream::badbit);
try
{
configFile.open(file.c_str(),ifstream::in);
if(configFile.is_open())
{
string line;
while (getline(configFile,line))
{
buffer.push_back(line);
}
configFile.close();
}
}
catch (ifstream::failure e){
throw e;
}
return buffer;
}
然后将每个行条目拆分为2D向量。为此你可以使用这个功能
vector<vector<string>> processCsvList(vector<string> csvList)
{
#define SINGER_CONFIG_COUNT 3 //number of comma separated data suppose to be in one line.
#define DELIMITED_CHAR ","
#define EMPTY_STRING "";
vector<vector<string>> tempList;
string configCell ="";
for(vector<string>::iterator it = csvList.begin(); it != csvList.end(); ++it)
{
if(*it == EMPTY_STRING)
{
continue;
}
stringstream configLine(*it);
vector<string> tempDevice;
for(int i=0; i<SINGER_CONFIG_COUNT; i++)
{
if(getline(configLine,configCell,DELIMITED_CHAR))
{
tempDevice.push_back(configCell);
}else
{
tempDevice.push_back(EMPTY_STRING);
}
}
tempList.push_back(tempDevice);
}
return tempList;
}
我没有尝试编译任何这些功能,因为我没有这样做的环境。但我认为这有助于思考方向。
现在您的数据在2D矢量中,如excell sheet。所以你可以通过内部向量的索引来访问。
答案 1 :(得分:0)
您可以创建一个std::map<string,vector<string>>
,然后您可以将地图中第2行以后的CSV文件的每一列存储为字符串向量,并按照第1行第1行中显示的文字进行键控。 CSV文件。
然后,您可以通过迭代std::map
的键来显示字段的名称,这些键可以按字母顺序方便地存储。
CSV文件第一行中的读取任务可以通过您已有的代码执行,也可以通过考虑全功能CSV文件中的引用字段等更复杂的内容来执行。