Solved

# Parsing / Computations On A Records File - Help

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

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

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

Question has a verified solution.

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

### Suggested Solutions

Title # Comments Views Activity
White board coding practice 3 98
FMX TCameraComponent Problem 2 105
c++ using a LPCOLESTR * and adding a string varaible to the Pointer 2 87
Gaming Software 1 38
Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
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.
###### Suggested Courses
Course of the Month6 days, 4 hours left to enroll

#### 734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.