• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 320
  • Last Modified:

How to get not matched records?

pqr,1234PQ,1234MN
xyz,7890AA,7890BB
mno,4567XX,4567YY
zzz,1111AA,2222BB
first field is city second field is x & third is y.

Contents of b.txt are as follows

abc,8899,TT
abc,8898,TT
abc,8897,TT
pqr,7766,RR
pqr,7765,RR
mno,6654,SS
xyz,5523,PP
xyz,5522,PP
first field is city second field is poco & third is adm.if city in b.txt matches with a.txt I want print the output as follows

pqr,@7766,@7765,1234PQ,1234MN,RR
mno,@6654,4567XX,4567YY,SS
xyz,@5523,@5522,7890AA,7890BB,PP

If city in b.txt does not exist in a.txt I want to write those records in seperate file.How to do this in c++?

The coding is as follows

#include <iostream>
#include <sstream>
#include <fstream>
#include <list>
#include <map>
#include <algorithm>

struct CityParms {
        std::string x,y,adm;
        std::list<std::string> poco_list;
        CityParms(const std::string& x = "",const std::string &y = "") : x(x),y(y) {}
};
typedef std::map<std::string,CityParms> CityParmsMap;

void process_a(CityParmsMap& map),process_b(CityParmsMap& map),report(const CityParmsMap& map);

int main()
{
        CityParmsMap map;
        process_a(map);
        process_b(map);
        report(map);
}

void process_a(CityParmsMap& map)
{
        std::ifstream f("a.txt");
        std::string str;
        while (getline(f,str)) {
                std::istringstream istr(str);
                std::string city,x,y;
                if (getline(istr,city,',') && getline(istr,x,',') && getline(istr,y,','))
                        map[city] = CityParms(x,y);
        }
}

void process_b(CityParmsMap& Map)
{
        std::ifstream f("b.txt");
        std::string str;
        while (getline(f,str)) {
                std::istringstream istr(str);
                std::string city,poco,adm;
                if (getline(istr,city,',') && getline(istr,poco,',') && getline(istr,adm,',')) {
                        CityParmsMap::const_iterator Citr = Map.find(city);
                        if (Citr != Map.end()) {
                                CityParms& cityParms = Map[city];
                                cityParms.poco_list.push_back("@"+poco);
                                cityParms.adm = adm;
                        } // Here what should be the condition if city is not found...
                }
        }
}

void report(const CityParmsMap& Map)
{
        std::ofstream f("report.csv");
        typedef CityParmsMap::const_iterator Citr;
        for (Citr itr = Map.begin();itr != Map.end();++itr) {
                const CityParms& cityParms = itr->second;
                const std::list<std::string> &poco_list = cityParms.poco_list;
                if (!poco_list.size())
                        continue;
                f << itr->first << ',';
                copy (poco_list.begin(),poco_list.end(),std::ostream_iterator<std::string>(f,","));
                f << cityParms.x << ',';
                f << cityParms.y << ',';
                f << cityParms.adm /*<< ','*/;
                f << '\n';
        }
}

Can anyone help me?
0
girija_cv
Asked:
girija_cv
  • 2
1 Solution
 
gmleemanCommented:
An elegant way is to load both files into 2 arrays, keeping the city text in alphabetical order - use insertion sorting perhaps, or assume they're already in alpha order.

Treat one file as your master (the smaller file perhaps)

and use your other file as the search file.

Then use a Binary search to search for every item contained in master for its matching city in the search file, report on every city you do not find. (You must keep the "search" file in alpha order to use a binary search).  A binary search is very efficient (on lists no bigger than 10000 records) and easy to code. (Also called a bi-ficating search)

It seems like you have the skill to write this, let me know if you need a hand with Sorting or Searching.

You may swap "master" (a.txt) with "search" (b.txt) file, depending on their size and the speed you need in this process.
0
 
gmleemanCommented:
Sorry - doubly linked lists and vectors, etc are just as elegant.  But "array" of some form is the theory I meant.  You may also use the file pointers instead of loading anything, but prone to disaster...
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now