2015-05-03 3 views
0

У меня есть 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 

Из того, что я мог бы сказать, приведенный выше код работает, если строка ввода разделителями пространства, а не с разделителями-запятыми.

У меня нет контроля над входом. Таким образом, простое замену «пробелов» на «запятые» в исходной строке не является идеальным решением, так как я не знаю, имеет ли вход уже пробелы.

Любые идеи? спасибо

ответ

0

Вы можете попробовать только прочитать разделитель с помощью std::getline(), а затем поместить его в поток строк для преобразования.

while (!infile.eof()){ 
    std::getline(infile, strValue, ','); 
    std::getline(infile, line); 
    strstr.str(line); 
    strstr.clear(); 
    int intValue; 
    strstr >> intValue; 
    foo(strValue, intValue); 
}