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
Solved

Parsing / Computations On A Records File - Help

Posted on 2006-06-18
4
234 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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

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

Suggested Solutions

Title # Comments Views Activity
c++ how to tell if the progra is ctl or mfc atl ect 6 84
C++ assignment question 7 236
I could not build boost code, 10 94
c++, dynamic object by json 1 53
Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

856 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