Parsing file by comma

Feb 2, 2017 at 4:20pm
I found this bit of code, on this forum, but there is not really an explanation of what it's doing. It's opening a file and reading it in, then it's supposed to remove the commas from the file. I just don't know what it's doing with the output or how to get that output with the comma removed.



Can anyone shed some light on this?

Thanks




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vector <vector <string> > data;
  ifstream infile( "test.txt" );

  while (infile)
  {
    string s;
    if (!getline( infile, s )) break;

    istringstream ss( s );
    vector <string> record;

    while (ss)
    {
      string s;
      if (!getline( ss, s, ',' )) break;
      record.push_back( s );
    }

    data.push_back( record );
  }
  if (!infile.eof())
  {
    cerr << "Fooey!\n";
  }
Feb 2, 2017 at 4:39pm
1. reads each line from the file stream into a string
2. uses the string to create a memory stream
3. reads each comma delimited sequence from the memory stream into another string

You can guess the rest.
Feb 2, 2017 at 4:48pm
how do I get output from it?

when I "cout" the variable "s" it gives me the contents of the file. but I haven't been able to find the contents of the file without the comma in it.


At this point my main goal is just to get the file back out without commas, then I can open it and use the ">>" to stick the values into the array i'm trying to build
Last edited on Feb 2, 2017 at 4:51pm
Feb 2, 2017 at 4:50pm
Line 1: Create a vector (represents the lines in the file) of vectors (represents strings read from a line),

Line 7: Read a line of text from the file into s.

Line 9: Create a stringstream from the line of text just read.

Line 10: Create a temporary vector (record) to hold the individual strings read from the line.

Line 12: Iterate through the stringstream (line).

Line 15: Read a part of the line delimited by a comma.

Line 16: Push the part of the line just read onto the temporary vector (record).

Line 19: Push the temporary vector (record) representing one line onto the outer vector (data) representing the file.

If you want to print the file without the commas, you need nested for loops. Iterate through the outer vector getting one record at a time. Then iterate through the inner vector (record) getting each substring.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main ()
{   vector <vector <string> > data;
    ifstream infile( "test.txt" );
    string line;
    string str;

    //  Read the file    
    while (getline(infile, line)) 
    {   istringstream ss (line);
        vector <string> record;
        
        while (getline(ss, str, ',')) 
            record.push_back(str);
        data.push_back (record);
    }
    //  Print the file without commas
    for (size_t i=0; i<data.size(); i++)
    {   vector <string>     record;
        
        record = data[i];
        //  Print each record
        for (size_t j=0; j<record.size(); j++)       
            cout << record[j] << " ";
        cout << endl;
    }   
    return 0;
}



Last edited on Feb 2, 2017 at 5:00pm
Feb 3, 2017 at 4:30am
Thank you!! that fixed a major hang up with my program that I was fighting with.

Below is what I am currently running and it's working as expected except for the output ends with "Total Even number =0" in a loop a few times before it terminates. Any idea where I have the loop logic screwed up?


Output looks like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
              Column    Column
Row number:0     3        2
Row number:1     4        5
Row number:2     2        2
Total Even Numbers = 4
Total Even numbers = 0
Row Number:0     1        2
Row Number:1     6        9
Row Number:2     3        5
Row Number:3     4        5
Total Even numbers = 3
Row Number:4     4        6
Row Number:5     8        5
Row Number:6     3        7
Total Even numbers = 3
Row Number:7     9        3
Row Number:8     8        2
Row Number:9     7        5
Total Even numbers = 2
Row Number:10     3        4
Total Even numbers = 1
Total Even numbers = 0
Total Even numbers = 0



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream> 
#include <vector>
#include <algorithm>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>
#define max_rows 3 
#define max_columns 2 
using namespace std; 
/*declare functions*/
int even (int A[3][2], int length, int width);
void file();
void file2();

//Main Function
int main() 
{ 
	int A[max_rows][max_columns]= {{3,2},{4,5},{2,2}}; 
	int length=1; 
	int width=1; 
	int row=0;
	int column;
	cout << "              Column    Column" << endl;
	for(int i=0; i<3; i++)    //This loops the rows.
	{
		cout<< "Row number:"<< row++ << " ";
		for(int j=0; j<2; j++) //This loops the columns
		{
			cout << "    "<< A[i][j]  << "    ";
		}
		cout << endl;
	}

	cout<<"Total Even Numbers = "<<even(A, length, width)<< endl; 
	file();
	return 0; 

} 
//Even Function
int even(int A[3][2],int length, int width) 
{ 
	int counter=0; 
	for (length=0; length<3; length++) 
		for (width=0; width<2; width++) 
		{ 
			int even=A[length][width]%2; 
			if(even==0) 
			{ 
				counter++; 
			} 
		} 
		return counter; 
}


//File read function
void file() {

	ofstream outputFile("temp.txt");


	vector <vector <string> > data;
	ifstream infile( "inFilePgm2A.dat" );
	string line;
	string str;

	//  Read the file    
	while (getline(infile, line)) 
	{   istringstream ss (line);
	vector <string> record;

	while (getline(ss, str, ',')) 
		record.push_back(str);
	data.push_back (record);
	}
	//  Print the file without commas
	for (size_t i=0; i<data.size(); i++)
	{   vector <string>     record;

	record = data[i];
	//  Print each record
	for (size_t j=0; j<record.size(); j++)       
		outputFile << record[j] << " ";
	outputFile << endl;


	}
	file2();
}
//Second file manuipluation function
void file2()
{


	static const int WIDTH = 2;
	static const int HEIGHT = 3;
	char level[HEIGHT][WIDTH]={0};
	int f;
	int g;
	int count;
	int row = 0;
	std::ifstream file;
	file.open("temp.txt");

	if(file.is_open())
	{

		//cout << "              Column    Column" << endl;
		while(!file.eof())
		{

			for(int i = 0; i < HEIGHT; i++)
			{
				for(int j = 0; j < WIDTH; j++)
				{
					//level[i][j] = ???
					file >>f;
					if ( f != -1){
						file >> g;
						cout << "Row Number:"<< row++ <<"     "<< f << "        "<< g << endl;
						if (f%2==0)
						{
							count++;
						}
						if (g%2==0){
							count ++;
						}

					}
					else	
					{
						cout << "Total Even numbers = " <<count << endl;
						count = 0;
					}
					//std::cout << std::endl;
				}
			}


		}
		file.close();

	}




}
Topic archived. No new replies allowed.