如何在 c++ 中获取导入文件中特定列的总和?

快乐人

我需要在导入的文件中获取薪水和扣减列的总和。

我需要在导入的文件中获取薪水和扣减列的总和。工资列是倒数第三列,例如。48000、47000、49000 等,扣除列是倒数第二列,例如。12000、12000、000 等在此处输入图像描述

我需要有关输出类似于此的代码的帮助:在此处输入图像描述

我目前使用 3 个文件,其中一个文件是 main.cpp 文件,一个 taxpayer.hpp 用于声明类的变量和函数,而 taxpayer.cpp 用于构造变量和函数。

这是存储文件的 github 的链接,包括上面的三个文件和 .txt 文件。https://github.com/Chuboi2442/taxpayerexample

阿明·蒙蒂尼

您需要了解不同的事情。例如:

属于一起但具有不同类型的数据将存储在类或结构中。

许多相同类型的数据将存储在一个数组中,或者在本例中存储在一个数组中,std::vector因为它可以动态增长。

因此,正如您已经做过的那样,您将把一行的数据,或者用数据库语言,将一条记录的数据放在一个结构中。

所以,你的方法是正确的,定义 TaxPayer 类。但是现在,因为要累积多个TaxPayers的一个数据字段的总和,所以需要将所有TaxPayers放在一个a中std::vector,并将其封装在第二个类中。然后向该类添加其他函数,以计算std::vector.

例子:

#include <string>
#include <vector>

struct TaxPayer {
    std::string taxpayerId{};
    std::string name{};
    std::string address{};
    std::string postcode{};
    int salary{};
    int deductions{};
    double taxDue{};
};
struct TaxPayers {
    std::vector<TaxPayer> taxPayers{};
};

我只是在这里显示数据成员。当然,您可以重用现有功能。

现在,我们只需要添加两个重要的功能:

  1. 将一个源行拆分为其元素,然后将其分配给 taxPayer 数据字段
  2. 阅读所有纳税人

第一个任务是拆分所谓的 CSV(逗号分隔值)数据。您将在 stackoverflow 上找到至少 1000 个有关如何执行此操作的示例。一种非常流行的方法是使用std::getline并阅读部分文本,直到分隔符','。

为了更加节省,首先通过读取源文件的完整行std::getline然后,这将被放入 astringstream并从那里完成进一步的数据提取。

所有这些都将嵌入一个覆盖的“提取”运算符>>中,该运算符处理您的特定数据。

这种操作符的签名是:

friend std::istream& operator >> (std::istream& is, TaxPayer& tp) 

实现该功能后,您可以简单地使用>>运算符,一步读取完整的行并对其进行解析。

在您的 TaxPayers 类中,您还需要定义这样的运算符并使用上述定义中的提取器读取所有行。

通过这种方法,通过将一个大任务拆分为多个小任务,最终解决方案将变得非常简单。

最后但同样重要的是,我们需要在std::vector. 这可以通过一个简单的循环来完成,或者更高级一点,使用std::accumulate.

您可以使用以下示例作为重构现有代码的想法:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

struct TaxPayer {
    // Data part
    std::string taxpayerId{};
    std::string name{};
    std::string address{};
    std::string postcode{};
    int salary{};
    int deductions{};
    double taxDue{};

    // Extractor
    friend std::istream& operator >> (std::istream& is, TaxPayer& tp) {
        // Read a complete line
        std::string line{};
        if (std::getline(is, line) and not line.empty()) {


            // Put it into a stringstream for further extraction
            std::istringstream iss{ line };

            // Now, extract the data parts
            std::getline(iss, tp.taxpayerId, ',');
            std::getline(iss, tp.name, ',');
            std::getline(iss, tp.address, ',');
            std::getline(iss, tp.postcode, ',');

            // Read and convert
            std::getline(iss, line, ',');
            tp.salary = std::stoi(line);

            std::getline(iss, line, ',');
            tp.deductions = std::stoi(line);

            std::getline(iss, line, ',');
            tp.taxDue = std::stod(line);
        }
        return is;
    }
    // Simple inserter
    friend std::ostream& operator << (std::ostream& os, const TaxPayer& tp) {
        return os << tp.taxpayerId << ' ' << tp.name << ' ' << tp.address << ' ' << tp.postcode
            << ' ' << tp.salary << ' ' << tp.deductions << ' ' << tp.taxDue << '\n';
    }

};
struct TaxPayers {
    // Data
    std::vector<TaxPayer> taxPayers{};

    // Sum functions
    int sumSalary() {
        int result{};
        for (const TaxPayer& taxPayer : taxPayers)
            result += taxPayer.salary;
        return result;
    }
    int sumDeductions() {
        int result{};
        for (const TaxPayer& taxPayer : taxPayers)
            result += taxPayer.deductions;
        return result;
    }

    // Extractor
    friend std::istream& operator >> (std::istream& is, TaxPayers& tp) {
        // clar old data
        tp.taxPayers.clear();

        // Read all new existing data and store in vector
        TaxPayer taxPayer{};

        while (is >> taxPayer)
            tp.taxPayers.push_back(taxPayer);
        return is;
    }
    // Simple inserter
    friend std::ostream& operator << (std::ostream& os, const TaxPayers& tp) {
        for (const TaxPayer& taxPayer : tp.taxPayers)
            os << taxPayer;
        return os;
    }


};

// Same as a file, I just use it here for better visibility
std::istringstream sourceFile{ R"(7101003,Mike,23 boinig road,2615,48000,12000,0
7201003,Jane Philips,29 boinig cresent,2616,47000,12000,0
7301003,Philip Jane,23 bong road,2615,49000,000,0
7401004,Peta,23 bong bong road,2615,148000,19000,0
7101205,Abdulla,23 Station st,2615,80000,21000,0)" };

int main() {

    TaxPayers taxPayers{};

    // Read and parse all tax payers
    sourceFile >> taxPayers;

    // Debug output: Show, what we just read
    std::cout << taxPayers;

    // Show sums
    std::cout << "\n\n\nSummary\n\nSalary:\t\t" << taxPayers.sumSalary() << "\nDeductions:\t" << taxPayers.sumDeductions() << '\n';
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章