Solved

How to get not matched records?

Posted on 2004-03-27
4
298 Views
Last Modified: 2010-04-17
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
Comment
Question by:girija_cv
  • 2
4 Comments
 
LVL 3

Accepted Solution

by:
gmleeman earned 20 total points
ID: 10697705
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
 
LVL 3

Expert Comment

by:gmleeman
ID: 10697710
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

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
zeroMAx challenge 20 76
array11 challenge 16 51
move one pixel 4 41
recursion example 16 69
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
This is an explanation of a simple data model to help parse a JSON feed
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now