2015-03-01 5 views
1

Я пытаюсь разобрать CSV-файл, а getline() читает весь файл как одну строку. Исходя из того, что getline() не получал ожидаемых результатов, я попробовал \r, \n, \n\r, \r\n и \0 как аргументы без везения.Анализ .csv файлов с CR LF Структура EOL

Я взглянул на символы EOL и увидел CR, а затем LF. Есть getline() просто игнорируя это или я что-то упускаю? Кроме того, что здесь исправить?

Целью этой функции является функция разбора CSV общего назначения, которая хранит данные в виде 2d-вектора строк. Хотя совет на этом фронте приветствуется, я только ищу способ исправить эту проблему.

vector<vector<string>> Parse::parseCSV(string file) 
{ 
    // input fstream instance 
    ifstream inFile; 
    inFile.open(file); 

    // check for error 
    if (inFile.fail()) { cerr << "Cannot open file" << endl; exit(1); } 

    vector<vector<string>> data; 
    string line; 

    while (getline(inFile, line)) 
    { 
     stringstream inputLine(line); 
     char delimeter = ','; 
     string word; 
     vector<string> brokenLine; 
     while (getline(inputLine, word, delimeter)) { 
      word.erase(remove(word.begin(), word.end(), ' '), word.end());  // remove all white spaces 
      brokenLine.push_back(word); 
     } 
     data.push_back(brokenLine); 
    } 

    inFile.close(); 

    return data; 

}; 

Вот гексагон. Я не уверен, что именно это показывает.

0000000 55 4e 49 58 20 54 49 4d 45 2c 54 49 4d 45 2c 4c 
0000010 41 54 2c 4c 4f 4e 47 2c 41 4c 54 2c 44 49 53 54 
0000020 2c 48 52 2c 43 41 44 2c 54 45 4d 50 2c 50 4f 57 
0000030 45 52 0d 31 34 32 34 31 30 35 38 30 38 2c 32 30 
0000040 31 35 2d 30 32 2d 31 36 54 31 36 3a 35 36 3a 34 
0000050 38 5a 2c 34 33 2e 38 39 36 34 2c 31 30 2e 32 32 
0000060 34 34 34 2c 30 2e 38 37 2c 30 2c 30 2c 30 2c 4e 
0000070 6f 20 44 61 74 61 2c 4e 6f 20 44 61 74 61 0d 31 
0000080 34 32 34 31 30 35 38 38 35 2c 32 30 31 35 2d 30 
0000090 32 2d 31 36 54 31 36 3a 35 38 3a 30 35 5a 2c 34 
00000a0 33 2e 39 30 31 33 35 2c 31 30 2e 32 32 30 34 31 
00000b0 2c 31 2e 30 32 2c 30 2e 36 33 39 2c 30 2c 30 2c 
00000c0 4e 6f 20 44 61 74 61 2c 4e 6f 20 44 61 74 61 0d 
00000d0 31 34 32 34 31 30 35 38 38 38 2c 32 30 31 35 2d 
00000e0 30 32 2d 31 36 54 31 36 3a 35 38 3a 30 38 5a 2c 
00000f0 34 33 2e 39 30 31 34 38 2c 31 30 2e 32 32 30 31 
0000100 

Первые две строки файла

UNIX TIME,TIME,LAT,LONG,ALT,DIST,HR,CAD,TEMP,POWER 
1424105808,2015-02-16T16:56:48Z,43.8964,10.22444,0.87,0,0,0,No Data,No Data 

UPDATE Похоже, это было \r. Я не уверен, почему это не сработало раньше, но я изучил несколько вещей во время изучения. Спасибо за помощь, ребята!

+0

ли * любой * из ответов на этот вопрос, [ «Как я могу прочитать и разобрать CSV-файлы в C++?»] (HTTP : //stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c), вообще помогите? – WhozCraig

+0

Я прочитал их, и хотя они решают, о чем я говорю, я не понимаю, что делать с этим. –

+0

Предполагая, что ваш файл прост, как описано. ваш код выглядит так, как будто это должно быть правильно. Итак, вы говорите, что 'while (getline (inFile, line))' нажимает * один раз * и разрывает * все *? На какой платформе это работает? – WhozCraig

ответ

-1

Вы пытались изменить порядок \r\n на \n\r?

+0

Да, я переключил их. Оказывается, getline() принимает только один символ в качестве разделителя. Таким образом, ни один из них не является допустимым и вызывает ошибку. –

+0

Getline имеет опцию разделителя, не так ли? Может быть, использовать это? –

+0

Параметр ограничителя принимает только один символ. –

1

Простое исправление было бы написать свой собственный getline
Например, один, который игнорирует любую комбинацию \n, \r
в начале строки, и разбивая на любом тоже.
Это будет работать на любой платформе, но не сохранит пустые строки.

После просмотра шестнадцатеричного дампа, разделителем является 0d (\r)