У меня есть csv, который я хотел бы tokenize по строкам с помощью StringStream. Ключ в том, что я знаю apriori, как выглядят столбцы. Так, например, сказать, что я знаю, что файл выглядит следующим образомВход StringStream с разделителями с запятыми - знанные столбцы apriori
StrHeader,IntHeader
abc,123
xyz,456
Я знаю заранее, что это столбец строки, а затем колонку Int.
Общий подход прочитать файл построчно
std::string line;
stringstream lineStream;
while (getline(infile, line)) // read line by line
{
cout << "line " << line << endl;
lineStream << line;
string token;
while(getline(lineStream, token, ',')) // push into vector? this is not ideal
{
}
Я знаю, что могу иметь 2 петли, и имеют внутренний цикл размечает строку, основанную на запятые. Множество примеров кода в stackoverflow сохранит результат в vector<string>
.
Я не хочу создавать новый вектор в каждой строке. Поскольку я знаю apriori, в каких столбцах должен иметь файл, могу ли я как-то непосредственно прочитать переменную string
и int
? Как выше этого
std::string line;
stringstream lineStream;
while (getline(infile, line)) // read line by line
{
cout << "line " << line << endl;
lineStream << line; // DOESNT WORK - tell lineStream we have comma delimited string
string strValue;
int intValue;
lineStream >> strValue >> intValue; // SO MUCH CLEANER
// call foo(strValue, intValue);
}
Проблема эта линия
lineStream << line; // DOESNT WORK - tell lineStream we have comma delimited string
Из того, что я мог бы сказать, приведенный выше код работает, если строка ввода разделителями пространства, а не с разделителями-запятыми.
У меня нет контроля над входом. Таким образом, простое замену «пробелов» на «запятые» в исходной строке не является идеальным решением, так как я не знаю, имеет ли вход уже пробелы.
Любые идеи? спасибо