Solved

Parsing / Computations On A Records File - Help

Posted on 2006-06-18
4
235 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
4 Comments
 
LVL 12

Accepted Solution

by:
rajeev_devin earned 50 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 50 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

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Suggested Solutions

This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

735 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