2015-03-11 3 views
0

есть ли библиотека или пример для чтения csv-файла на C++, например, csv-модуль в Python?C++ csv читатель с функциональностью python csv.dictreader

Мне нужна функция чтения файла csv и поместить каждый элемент столбца в строку с именем заголовка в качестве значения ключа.

+0

Прочитайте файл построчно, а затем использовать strtok() функцию с разделителем в CSV разделителем и сохранять значения в карте – Anshul

+0

Я думаю, что это дубликат вопрос. Взгляните на http://stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c – user3590169

ответ

1

Я могу ответить сам. Я написал класс CSVDict.

#include <iterator> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <string> 
#include <map> 

class CSVDict { 
public: 
    CSVDict(std::string fileName, int headerRow) { 
     file = std::ifstream(fileName); 
     for (int i = 0; i < headerRow; i++){ readNextRow(file); } 
     m_header = m_data; 
    } 
    std::string const& operator[](std::size_t index) const { 
     return m_data[index]; 
    } 
    std::string const& operator[](std::string index) const { 
     return m_dataMap.find(index)->second; 
    } 
    bool readNextRowMap() { 
     readNextRow(file); 
     if (!file) return false; 
     m_dataMap.clear(); 
     auto it_data = m_data.begin(); 
     for (auto it = m_header.begin(); it != m_header.end(); ++it) { 
      m_dataMap[*it] = *it_data; 
      ++it_data; 
     } 
     return true; 
    } 
private: 
    void readNextRow(std::istream& str) { 
     std::string   line; 
     std::getline(str, line); 
     if (!str) return; 

     std::stringstream lineStream(line); 
     std::string   cell; 

     m_data.clear(); 
     while (std::getline(lineStream, cell, ';')) { 
      m_data.push_back(cell); 
     } 
    } 
    std::vector<std::string> m_data; 
    std::vector<std::string> m_header; 
    std::map<std::string, std::string> m_dataMap; 
    std::ifstream file; 
}; 


int main() 
{ 
    CSVDict    dict("1.csv", 2); 
    while (dict.readNextRowMap()) { 
     std::cout << dict[0] << " " << dict[1] << " " << dict[2] << " " << dict[3] << " " << dict[4] << " " << dict[5] << " " << dict[6] << "\n"; 
    } 

    CSVDict    dict1("1.csv", 2); 
    dict1.readNextRowMap(); 
    std::cout << dict1["ipField"] << " " << dict1["mdBeamEnergy"] << " " << dict1["mdBeamCurrent"] << " " << dict1["mcoBeamSizeId"] << " " << dict1["mdGantryAngle"] << " " << dict1["miLayerNumber"] << "\n"; 
    dict1.readNextRowMap(); 
    std::cout << dict1["ipField"] << " " << dict1["mdBeamEnergy"] << " " << dict1["mdBeamCurrent"] << " " << dict1["mcoBeamSizeId"] << " " << dict1["mdGantryAngle"] << " " << dict1["miLayerNumber"] << "\n"; 
    dict1.readNextRowMap(); 
    std::cout << dict1["ipField"] << " " << dict1["mdBeamEnergy"] << " " << dict1["mdBeamCurrent"] << " " << dict1["mcoBeamSizeId"] << " " << dict1["mdGantryAngle"] << " " << dict1["miLayerNumber"] << "\n"; 

    dict.readNextRowMap(); 
    std::cout << dict[0] << " " << dict[1] << " " << dict[2] << " " << dict[3] << " " << dict[4] << " " << dict[5] << " " << dict[6] << "\n"; 
    return 0; 
} 

Пример CSV файл:

#VALUES;;;;;; 
ipField;mdBeamEnergy;mdBeamCurrent;mcoBeamSizeId;mdGantryAngle;miLayerNumber;mbRoomSwitchingLayer 
24.30815;172.152971;24.30815;4;65;1;1 
24.30815;172.152971;24.30815;4;65;2;0 
24.30815;172.152971;24.30815;4;65;3;0 
24.30815;172.152971;24.30815;4;65;4;0 
24.30815;172.152971;24.30815;4;65;5;0 
24.30815;172.152971;24.30815;4;65;6;0 
24.30815;172.152971;24.30815;4;65;7;0 
24.30815;172.152971;24.30815;4;65;8;0 

использования (см основную функцию в примере):

конструктор класса должен иметь формат CSV файла и заголовок CSV номер строки каждый readNextRowMap Получает значения следующей строки в файле csv вы можете адресовать значения либо индексом числа, либо заголовком

обратная сторона:

CSV файл должен иметь строку заголовка

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