Man kunne starte med:
#include <map>
#include <vector>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
template <typename T>
bool FromString(T &aValue, const std::string &aStr)
{
std::stringstream ss(aStr);
return ss >> aValue;
}
std::map<int, std::string>PostNummer2StrTabel;
std::map<std::string, int>Str2PostNummerTabel;
int main(int argc, char *argv[])
{
if(argc != 3)
{
std::cerr << "Usage: " << argv[0] << " PostNrFil Kartotkfil" << std::endl;
return 0;
}
std::string S1, S2;
std::ifstream PostNrFil(argv[1]);
while(std::getline(PostNrFil, S1, ',') && std::getline(PostNrFil, S2))
{
int Nr;
FromString(Nr, S1);
std::string::size_type Pos = S2.find_first_not_of(' ');
S2 = S2.substr(Pos);
PostNummer2StrTabel.insert(std::make_pair(Nr, S2));
Str2PostNummerTabel.insert(std::make_pair(S2, Nr));
}
std::ifstream AddrFil(argv[2]);
std::string S3, S4;
while(std::getline(AddrFil, S1, ',') &&
std::getline(AddrFil, S2, ',') &&
std::getline(AddrFil, S3, ',') &&
std::getline(AddrFil, S4))
{
int Nr;
FromString(Nr, S3);
std::map<int, std::string>::iterator it = PostNummer2StrTabel.find(Nr);
if(it != PostNummer2StrTabel.end())
{ // Brug distrikt fra tabel
std::cout << S1 << "," << S2 << ", " << S3 << ", " << it->second << std::endl;
}
else
{
std::map<std::string, int>::iterator it2 = Str2PostNummerTabel.find(S4);
if(it2 != Str2PostNummerTabel.end())
{ // Brug postnummer fra tabel
std::cout << S1 << "," << S2 << ", " << it2->second << ", " << S4 << std::endl;
}
else
{ // Ikke fundet i tabel, bare udskriv
std::cout << S1 << "," << S2 << ", " << S3 << ", " << S4 << std::endl;
}
}
}
}
Det er måske nødvendigt at fjerne mellemrum før/efter de enkelte dele.
Jeg har ikke testet ovenstående.
(Har du stillet samme spørgsmå i et andet forum ?)