1

我有一个可以成功读取 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 文件中的开胃菜、菜肴、饮料等内容。

4

2 回答 2

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;
}

我没有尝试编译任何这些函数,因为我在这里没有这样做的环境。但我认为这将有助于思考方向。

现在你的数据在一个二维向量中,比如 Excel 表。所以你可以通过内部向量的索引来访问。

于 2013-04-08T04:08:25.670 回答
0

您可以创建一个std::map<string,vector<string>>,以便您可以将 CSV 文件的每一列从第 2 行开始存储在地图中作为字符串向量,由 CSV 文件第 1 行的列中出现的文本作为键控。

然后,您可以通过遍历 的键来显示字段的名称,这些键std::map按字母顺序方便地存储。

读取 CSV 文件第一行的任务可以由您已经拥有的代码执行,或者更复杂的代码执行,这些代码考虑到在功能齐全的 CSV 文件中找到的引用字段等。

于 2013-04-08T04:31:39.637 回答