接收文件并删除文件中的重复项

时间:2017-10-28 06:36:59

标签: c++ file sorting io

我有一个逗号分隔的文件,扩展名为.csv,条件如下:

30,Movies,53808-0776,278,65.75
31,Beauty,48951-8130,725,83.42
32,Baby,59779-224,848,82
33,Industrial,55711-070,753,46.48
34,Industrial,76446-002,272,89.03
35,Sports,68151-2870,185,2.86
36,Toys,0245-0709,783,45.65
37,Games,49999-963,523,93.65 
38,Beauty,52125-508,500,2.38
39,Toys,54092-381,783,45.65
40,Beauty,55154-6649,666,79.52
41,Jewelry,57664-327,46,10.28
42,Grocery,49738-453,317,29

我需要我的程序做的是接收这种格式的任何通用文件,删除重复项,然后创建一个没有重复项的相同扩展名的新文件。用户键入文件的确切位置。我正在使用一个类来保存单个数据记录。这是我到目前为止我的标题。

#ifndef RECORD_H_
#define RECORD_H_
#include <iostream>

class Record {
public:
// Constructor
    std::Record(string department, string item_code, int quantity, double cost);
// Deconstructor
    virtual ~Record();
// Overloaded '==' and '<' Comparision Methods
    friend bool operator ==(const Record &a, const Record &b);
    friend bool operator <(const Record&, const Record&);
// Overloaded '<<' Operator
    friend std::ostream& operator <<(std::ostream&, const Record&);
// Private Member Functions
private:
    std::string department;
    std::string item_code;
    int quantity;
    double cost;
};
#endif /* RECORD_H_ */

文件都很小,所以简单的排序方法有效。我对这些方面很困惑。我是否在源代码中将对象存储在向量中,或者我是否需要为此创建定义?另外,如果我接收一个文件,如何让程序在同一个扩展名中创建一个新文件? (的.csv)

1 个答案:

答案 0 :(得分:0)

假设您的问题中描述的Record类具有已定义的operator==,并且您有一个这样的向量,您可以从csv文件读入内存,您可以执行以下操作:使用算法库删除重复项:

std::vector<Record> records; // full of Record

// rearranges the vector, moving all the unique elements to the front
// and duplicates to the back
// last is an iterator to beginning of the duplicates
auto last = std::unique(records.begin(), records.end());

// erase all duplicates
records.erase(last, records.end());

注意std::unique将使用operator==中定义的Record