Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

How to get not matched records?

Posted on 2004-03-27
4
Medium Priority
?
311 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 3

Accepted Solution

by:
gmleeman earned 80 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

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
In this post we will learn different types of Android Layout and some basics of an Android App.
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…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

730 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