musclesmania05 Ответов: 2

Разбор csv-файла в вектор и преобразование в соответствующие типы данных


Привет всем, я работаю с разбором CSV-файла с помощью c++, я успешно проанализировал данные, но теперь я пытаюсь преобразовать каждый столбец в соответствующий ему тип, как я объявил a-j. Я просто говорю somenumbers dd. a = stod(vector[0]) например, я надеюсь, что это действительно, потому что данные будут отправляться в csv-файл непрерывно, так что может быть n строк, но я знаю, что есть только 10 столбцов. Я просто хочу убедиться, что, делая то, что я делаю, каждая переменная будет получать свои данные после каждого сканирования? и ни одна строка данных не будет пропущена?

	typedef struct {
		int a=0;
		int b=0;
		int c=0;
		double d=0;
		double e=0;
		double f=0;
		double g=0;
		int h=0;
		double i=0;
		double j=0;
	}somenumbers;

	vector<vector<string> > matrix;
	somenumbers dd;
	string line;
	ifstream file("mynumbers - Copy.csv");
	
	if (!file.is_open())
	perror("error while opening file");
	
	
	getline(file, line, '\n');

	while (getline(file, line, '\n')) //find the endline charcater
	{

		vector<string> vec;
		string linevec;
		istringstream ss(line);//allows for parsing each line 

		while (getline(ss, linevec, ','))
		{

			vec.push_back(linevec);//push the parsed data for that line into a vector

		}

		
		dd.a= stod(vec[0]);
		dd.b = stod(vec[1]);
		cout << dd.a << endl;
		
		matrix.emplace_back(vec);//push each parsed line into another vector
		
		
}


Что я уже пробовал:

Я успешно получил все конечные символы и запятые
csv-файл отформатирован следующим образом
a, b, c, d, e, f, g, h, i, j
1.,
.
.
.
.
Н., строк

2 Ответов

Рейтинг:
2

Garth J Lancaster

Это достаточно просто, чтобы проверить ваши петли(ы), чтобы

узнать
разделите строку на разделенные запятыми "переменные"

- Я бы сначала сосредоточился на этом ... однако это

getline(file, line, '\n');

  while (getline(file, line, '\n')) //find the endline charcater


Итак, вы собираетесь получить строку, немедленно отбросить ее и получить другую строку (в то же время) - есть ли причина для отбрасывания первой строки ? Я понимаю, если это строка "заголовка", но тогда вы можете прокомментировать этот факт в коде, чтобы кто-то еще читал "почему".

этот код-я предполагаю, что это просто тестирование

dd.a= stod(vec[0]);
       dd.b = stod(vec[1]);


вы бы не стали действительно жестко кодировать весь путь до vec[9], не так ли ? вы бы использовали цикл FOR, если бы были на 100% уверены, что когда - либо будет только 10 столбцов, или использовали бы итератор на 'vec' - лично я бы использовал итератор, вел бы подсчет, и если бы у вас было больше 10 столбцов, остановите запуск

[edit] хорошо, я оглянулся назад и увидел это

typedef struct {
      int a=0;
      int b=0;
      int c=0;
      double d=0;
       double e=0;
       double f=0;
       double g=0;
       int h=0;
      double i=0;
       double j=0;
   }somenumbers;


есть ли у вас намерение разобрать каждую строку файла " csv "в структуру "somenumbers"? если это так, то все, что я сказал, все еще применимо - в этом случае я, вероятно, все еще буду использовать итератор/счетчик для назначения из vec[] некоторым номерам, как в

...
switch(fieldNumber) :
case 0 : a = convertToInt(vec[fieldNumber]);   
case 1 : b = convertToInt(vec[fieldNumber]);   
...


там, где convertToInt-это какая-то функция, которую вы должны преобразовать из строки в Int, вам также понадобится convertToDouble, я думаю

[/редактировать]


musclesmania05

Я не уверен, как использовать векторный итератор, когда у вас есть структура разных типов ?? если да, пожалуйста, объясните или покажите?

Рейтинг:
1

musclesmania05

Да, причина getline в первой строке заключается в том, что строка заголовка.

Да, я тестировал в надежде на лучший способ, я не уверен, как использовать итератор на vec, можете ли вы объяснить?
а также я вставляю vec в матрицу, так что буду ли я использовать итератор на матрице вместо этого?
Наконец, да, "struct somenumbers" относится к типам столбцов, так что почему это так, когда я вижу столбец 1, я знаю int ... и так далее.