2014-09-08 5 views
0

CSV 파일을 입력으로 사용하여 현재 값을 수정 (계산 수행)하고 다시 출력 할 수있는 프로그램을 작성하려고합니다. CSV 형식으로 새 값을 추가합니다.CSV 파일 가져 오기, 편집 및 수정 된 값으로 출력

큰 파일을 허용하기 때문에 값이 저장되는 구조체는 2D 벡터입니다.

struct data_t: deque <deque <float> > 
{ 
    typedef deque <deque <float> > ::iterator record_iterator; 
    typedef deque  <float> ::iterator field_iterator; 
    bool load(const string& filename); 
    bool save(const string& filename); 
    bool save(ostream& outs); 
}; 

데이터에 getline이로드됩니다.

bool data_t::load(const string& filename) 
{ 
    string s; 
    ifstream f(filename.c_str()); 
    while (getline(f, s)) 
    { 
    deque <float> record; 
    istringstream iss(s); 
    while (getline(iss, s, ',')) 
    { 
     float fieldvalue = 0.0f; 
     istringstream(s) >> fieldvalue; 
     record.push_back(fieldvalue); 
    } 
    this->push_back(record); 
    } 
    return f.good(); 
} 

그리고이 두 가지 기능으로 데이터가 저장됩니다. 이제

bool data_t::save(const string& filename) 
{ 
    ofstream f(filename.c_str()); 
    if (!f) return false; 

    return save(f); 
} 

bool data_t::save(ostream& outs) 
{ 
    for (data_t::record_iterator ri = this->begin(); ri != this->end(); ri++) 
    { 
    for (data_t::field_iterator fi = ri->begin(); fi != ri->end(); fi++) 
     outs << ((fi == ri->begin()) ? "" : ", ") << *fi; 
    outs << endl; 
    } 
    return outs.good(); 
} 

, I 출력 전에 데이터, 내가 Excel에서 csv 파일이기 때문에 특정 열 (열 24, 25, 48, 49의 값을받는 함수를 만들려고하고 있어요 형식 - 행 및 열)을 사용하고 여러 계산을 수행합니다. 본질적으로, 나는 특정 가치에 접근 할 수 있어야한다.

열 24의 첫 번째 줄에서 하나의 값을 선택해 보겠습니다. pop_back을 사용하면 처음부터 가져올 때이 큐를 채울 때 push_back을 사용하여 뒤에서 값을 밀어 넣은 것으로 간주 할 수 있습니다. . 0부터 시작하기 때문에 pop_back (23)과 비슷합니까? 원래 파일의 1 행 24 열에 해당하는 값을 제공하겠습니까?

도와

, 여기에 액세스 할 수있는 데이터가 파일 original csv file

+0

임의의 열 인덱스에서 액세스하려면'std :: deque' 대신'std :: vector'를 사용하십시오. –

+0

@ πάνταῥεῖ deque는 벡터처럼 무작위 접근을 허용합니다 ... –

+0

@ Mr.WorshipMe 좋아요, 왜 여기에 그것을 사용해야하는지 이유는 모르겠습니다. –

답변

1

표준에서와 pop_back (INT) 같은 건 :: 양단 큐가 없습니다 ... 에서 어떻게 구성되어 있는지의 스냅 샷입니다 첫 번째 셀은 컬럼 24의 첫 번째 셀 (* this) [0] [23]입니다. 첫 번째 인덱스는 행 인덱스이며, 행 전체를 deque의 deque로 푸시 했으므로 두 번째 인덱스는 열 인덱스입니다.

바람직 :

data_t table; 
table.load("bla.csv"); 
//process table[0][23] 
//... 

또는 더 나은 : 부하를 얻고 구조체에서 멤버 함수를 저장하고 typedef vector<vector<float>> table_t를 사용 - 양단 큐 벡터 또는 용기 또는 상속 할 필요에 ... 없다 사실 가상 소멸자가없는 클래스를 상속하면 문제가 생길 것입니다. 그리고 encapsulation에 누락되었습니다.

저장 및로드가 무료 템플릿 기능이었던 경우 CSV 및 컨테이너를로드하고 필요할 때 시간을 절약 할 수있었습니다.

+0

컨테이너 클래스를 상속하지 말고 관리되는 멤버가 있어야 함을 언급하십시오. –