首页 > 解决方案 > 数着数。C ++中csv文件中的单词

问题描述

我试图数数。日期存储在 CSV 文件的第一行(以逗号分隔):- State,Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20, 20 年 1 月 26 日我必须数一数。Long 之后的日期(即输出 = 5)。我已经编写了读取 CSV 文件的代码,如下所示,但是,我该如何计算编号。很久以后的日期。非常感谢您的帮助。请随时询问任何其他信息。谢谢。

char** readCSV(const char* csvFileName, int& csvLineCount)
{
    ifstream fin(csvFileName);
    if (!fin)
    {
        return nullptr;
    }
    csvLineCount = 0;
    char line[1024];
    while(fin.getline(line, 1024))
    {
        csvLineCount++;
    };
    char **lines = new char*[csvLineCount];
    fin.clear();
    fin.seekg(0, ios::beg);
    for (int i=0; i<csvLineCount; i++)
    {
        fin.getline(line, 1024);
        lines[i] = new char[strlen(line)+1];
        strcpy(lines[i], line);
    };
    fin.close();
    return lines;
}

标签: c++algorithmcsv

解决方案


这看起来就像您正在读取包含一个或多个子记录的记录。
我建议使用一个Date类和一个Record类。

class Date
{
  public:
    unsigned int month_num;
    unsigned int day_num;
    unsigned int year_num;

    friend std::istream& operator>>(std::istream& input, Date& d);
};

std::istream& operator>>(std::istream& input, Date& d)
{
    char forward_slash;
    input >> d.month_num;  input >> forward_slash;
    input >> d.day_num;    input >> forward_slash;
    input >> d.year_num;
    return input;
}

operator>>类的重载Date稍后会派上用场。

现在记录类:

class Record
{
  public:
    std::string    state;
    std::string    region;
    std::string    latitude;
    std::string    longitude;
    // A container for the date subrecords
    std::vector<Date> dates;

    friend std::istream& operator>>(std::istream& input, Record& r);
};

std::istream& operator>>(std::istream& input, Record& r)
{
     std::string text_line;
     std::getline(input, text_line);
     std::istringstream record_stream(text_line);
     std::getline(record_stream, r.state, ',');
     std::getline(record_stream, r.region, ',');
     std::getline(record_stream, r.latitude, ',');
     std::getline(record_stream, r.longitude, ',');
     Date d;
     while (record_stream >> d)
     {
         r.dates.push_back(d);
         char comma;
         record_stream >> comma;
     }
     return input;
}

上面的函数读取输入的文本行,因为记录由换行符终止。从文本行创建一个流。该流有助于读取可变数量的日期。

编辑 1:读取文件
您的输入代码将如下所示:

std::vector<Record> database;
Record r;
while (fin >> r)
{
    database.push_back(r);
}

是的,您可以使用 C 字符串和数组,但是 C++ 流式处理和std::vector简化代码,简单代码比复杂代码的缺陷更少。

此外,std::vectorstd::string类为您管理动态内存。它们根据需要扩展。无需检查数组溢出。它们也更容易通过。传递数组还需要传递容量(可能还有数组中元素的数量)。


推荐阅读