словарь — Использование функции indexof в переполнении стека

Мой этот вопрос основан на предыдущем вопросе, который я задал.

Многоуровневое создание хешей / словарей в C ++

У меня есть эта структура, которую мне нужно сохранить в unordered_map с помощью функции indexof. Я использую файл конфигурации, как указано в предыдущем вопросе. Мне нужно сохранить первую строку в качестве индекса, а последующие значения в виде массива под этим индексом.

До сих пор я был в состоянии сделать это.

#include <cstdlib.h>

#include <stdafx.h>
#include <string.h>
#include <stdio.h>
#include <unordered_map>
#include <iostream>
#include <string>
using namespace std::tr1;

#define false 0
#define true 1

int main()
{
unordered_map <std::string, int> m;
FILE *f;

char c[255];
char * pnt;

f=fopen("Config.csv","r");
if(f==NULL)
return 1;

while(!feof(f))
{
fgets(c, 255, f);  //go to the next line
pnt = strtok( c, ",");
while( pnt!= NULL )
{

//the code for storing the values goes here.
pnt = strtok( NULL, "," );
}
}
fclose(f);
return 0;
}

Мой CSV-файл выглядит так —-

USN,Name,DOB,Sem,Percentage
111,abc,07/03,3,88
112,cde,18/07,4,77

-1

Решение

Мне кажется, что правильная структура данных для использования std::unordered_map<std::string,std::vector<std::string>>, а также не unordered_map<std::string,int>, поскольку ваша текущая реализация пытается. Это потому, что поля, которые вы хотите сохранить, больше похожи на строки; некоторые вообще не целые.

Первым шагом является извлечение имен полей, чтобы впоследствии их можно было использовать как unordered_map ключи. Затем начните извлекать строки данных, разбивая их на поля. Затем для каждого имени поля push_back данные поля для данной строки CSV. Вот пример (использует некоторые конструкции C ++ 11):

#include <string>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <sstream>

std::vector<std::string> split ( std::string );

int main () {

// Sample data for a self-contained example.
std::vector<std::string> raw_data {
"USN,Name,DOB,Sem,Percentage",
"111,abc,07/03,3,88",
"112,cde,18/07,4,77"};// Ordered container for field names, unordered for field vectors.
auto field_names = split( raw_data[0] );
std::unordered_map<std::string,std::vector<std::string>> parsed;// Store fields as vector elements within our unordered map.
for( auto it = std::begin(raw_data) + 1; it != std::end(raw_data); ++it ) {
auto fields = split( *it );
auto field_it = std::begin(fields);
for( auto name_it = std::begin(field_names);
name_it != std::end(field_names);
++name_it,
++field_it
) {
parsed[*name_it].push_back(*field_it);
}
}// Dump our data structure to verify it's correct;
for( auto fn : field_names ) {
std::cout << fn << "\t";
}
std::cout << "\n";
for ( size_t ix = 0; ix != parsed[field_names[0]].size(); ++ix ) {
for( auto fn : field_names ) {
std::cout << parsed[fn][ix] << "\t";
}
std::cout << "\n";
}
std::cout << std::endl;return 0;
}std::vector<std::string> split ( std::string instring ) {
std::vector<std::string> output;
std::istringstream iss(instring);
std::string token;
while( getline( iss, token, ',' ) ) {
output.push_back(token);
}
return output;
}

В моем примере я начинаю с входных данных, содержащихся в векторе с именем raw_data, В вашем случае вы извлекаете данные из файла. Итак, я имею дело с наращиванием структуры данных, поскольку я предполагаю, что обработка файлов не является основной частью вашего вопроса. Вы должны быть в состоянии легко адаптировать токенизацию и создание структуры данных из моего примера.

Также я понимаю, что вы используете tr1 :: unordered_map, что, вероятно, означает, что вы не используете C ++ 11. Тем не менее, мои C ++ 11-измы на самом деле просто используют синтаксический сахар, который можно без особых усилий понизить до эквивалентной совместимости с C ++ 03.

Обратите внимание, что это относительно наивный подход к анализу CSV. Это делает предположения, которые могут работать для ваших данных CSV, но могут не работать для всех форм CSV. Например, он не имеет дело с цитированием полей, чтобы включить запятые в полях. Он также не касается запятых без обратной косой черты и множества других проблем с анализом CSV.

Если ваш набор данных ведет себя не так, как этот анализатор, с ним можно справиться, вам следует искать полноценную библиотеку синтаксического анализа CSV, а не возиться с прокруткой собственного синтаксического анализатора. … по крайней мере, это то, что я бы сделал, если бы мне было поручено разбирать менее тривиальные формы CSV.

0

Другие решения


По вопросам рекламы [email protected]