?
Solved

Parsing / Computations On A Records File - Help

Posted on 2006-06-18
4
Medium Priority
?
240 Views
Last Modified: 2010-04-01
Hi,

   I am new to C++ and am not very fimiliar with it.  I have used Java before, and many of the things I would utilize in Java are not available to me, so I am in need of some assistance.

   If I have txt file that has one record on each line, made up of three fields, seperated by spaces.  For example:

"01/01/01"   "a command"   "a resource"

all without "" marks, which I am just using to keep the fields separate for the post.

I have to do the following computations on them:

- avg number of requests per day.
- avg number of each individual command per day.
- avg number of requests per resource per day.


Any help of how to go about doing this is appreciated.  Thanks.
0
Comment
Question by:SuperG03
[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
4 Comments
 
LVL 12

Accepted Solution

by:
rajeev_devin earned 200 total points
ID: 16931723
>> "01/01/01"   "a command"   "a resource"
01/01/01   a command   a resource
If the fields are not delimited by "", then how do you say there are 3 records, not 5.
How do you exactly read them in JAVA.

Can you give a more complete sample of data
And if possible post your code in JAVA.

So, that we can gve you alternative functions in C++.
0
 
LVL 39

Assisted Solution

by:itsmeandnobodyelse
itsmeandnobodyelse earned 200 total points
ID: 16933340
>>>> Can you give a more complete sample of data

As rajeev told the fields "a command" and "a resource" definitively may not contain space characters. Assuming that is the case you would/could solve like that:

struct Record
{
     string date;
     string command;
     string resource;
};

    ...
    vector<Record> records;
    ifstream ifs("file.dat);
    string line;
    while (getline(ifs, line))
    {
          Record rec;
          int pos1 = line.find(' ');
          if (pos1 != 8)  // assuming mm/dd/yy
              continue;   // error
          int pos2 = line.find(' ', pos1+1);
          if (pos2 == string::npos)
                continue;  // error
          //                        year                    day                      month
          rec.date = "20" + line.substr(6, 2) + line.substr(0, 2) + line.substr(3, 2);
          rec.command = line.substr(pos1+1, pos2-pos1);
          rec.resource  = line.substr(pos2+1);
          records.push_back(rec);
    }

After that all records are in the dynamic array. To get the statistics you should sort the records array either by date, command, resource or a combination of both.

You could do that by providing a built-in operator< that can be switched by setting an appropriate class member:

struct Record
{
     string date;
     string command;
     string resource;

     enum SortMode { DATE, COMMAND, RESOURCE, DATE_COMMAND, DATE_RESOURCE };
     static SortMode sortMode;

      bool operator<(const Record& r) const
      {
           switch(sortMode)
           {
           case DATE: return date < r.date;
           case COMMAND: return command < r.command;
           case RESOURCE: return resource < r.source;
           case DATE_COMMAND: return date < r.date || (date == r.date && command < r.command;
           case DATE_RESOURCE: return date < r.date || (date == r.date && resource < r.resource;
           }
      }
      static void SetSortMode(SortMode smode) { sortMode = smode; }
     
};

// in some cpp initialization of the static member

Record::SortMode Record::sortMode = DATE;


With that you could sort the array from above, e. g. by

     
          Record::SetSortMode(Record::DATE_COMMAND);

          sort(records.begin(), records.end());

After sorting you easily can make the statistics by iterating the (sorted) array and watching the changes.

Regards, Alex
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
Suggested Courses
Course of the Month14 days, 18 hours left to enroll

771 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