2013-11-12 3 views
4

Я хочу, чтобы прочитать файл CSV с помощью C++ так вот мой кодC++ чтение CSV файл

int main(){ 
ifstream classFile("class.csv"); 
vector<string> classData; 

while (getline(classFile, line,',')) // there is input overload classfile 
     { 
      classData.push_back(line); 

     } 
} 

вот мой вопрос: моя проблема в том, когда он читает последний столбец каждой строки (с ней не разделена запятой) считывает последние данные столбца и первые из следующих данных строк , например, если мои данные были как

имя класс, classLocation, профессор C++, библиотека, Джон

, то он читается как className/classLocation/Professor C++/Library/John

В любом случае, я могу отделить мой последний столбец от первой следующей строки? Спасибо и извините, что это сбивает с толку

+0

CSV должен иметь конец-строки после каждой записи. У вашего csv есть конец строки после каждой записи? То, что вы можете сделать, это сначала получить строку, а затем делить с помощью ','. – wendelbsilva

+1

http://stackoverflow.com/questions/7621727/split-a-string-into-words-by-multiple-delimiters-in-c вы собираетесь использовать 2 разделителя ',' и '\ n' в вашем случае вы используете только ',' поэтому '\ n' становится частью строки – abasu

+0

Возможный дубликат [Разделение строки csv-файла на std :: vector?] (http://stackoverflow.com/questions/ 11310947/splitting-a-line-of-a-csv-file-in-a-stdvector) –

ответ

16

Прочитайте файл построчно:

std::string line; 
while(std::getline(stream, line)) ... 

Pass каждая строка в istingstream и чтения полей:

std::istringstream s(line); 
std::string field; 
while (getline(s, field,',')) ... 

Отказ от ответственности: Это упрощенный синтаксический анализ csv-файла.

+0

все в цикле while? –

+1

Определенно в какой-то петле. Цикл while - достойный выбор, потому что вы не обязательно знаете, как долго будет файл .csv, а условие завершения будет просто исчерпано. – RangerRick

+0

wow !! оно работает!! Я понятия не имею, как и почему, но это работает! XD спасибо! –

2

Извините, могу ли я засунуть в какой-то простой C в эту тему?

Чтение CSV довольно ясно есть:

#include <stdio.h> 


int main() 
{ 
    float f1, f2; 

    FILE *fp; 
    fp = fopen("file.csv", "r"); 

    while (fscanf(fp, "%g,%g\n", &f1, &f2) == 2) 
    printf("%g\n", f1+f2); 
} 

И совсем, конечно, он должен работать там, где работает C++.

Там, в while, мы проверяем, сколько объектов найдено fscanf: fscanf(fp, "%g,%g\n", &f1, &f2) == 2 - fscanf возвращает количество найденных объектов.

Я надеюсь, что это может помочь кому-то.

(А если кто-то хотел бы видеть больше информации о fscanf и чтения файлов. - оставить некоторые комментарии)

+0

Не пробивается ли это под самые тривиальные изменения в формате CSV, например, пробел после запятой или разный (не-unix) разрыв строки? –

+1

Да, это, безусловно, сломается. И, добавив к проблеме пробелов в CSV-файле, количество полей в программе фиксировано, что не относится к getline. (Хотя, как правило, количество полей фиксируется в CSV-файлах.) – xealits

Смежные вопросы