2009-11-18 4 views
1

각 행에서 데이터를 읽고 저장해야하는 데이터 파일이 있습니다. 그런 다음 해당 데이터 중 하나의 값에 따라 해당 데이터를 배열에 저장하므로 이러한 모든 데이터의 중앙값을 계산할 수 있습니다.C++에서 파일에서 구조화 된 데이터를 읽는 방법?

데이터 라인은 인구 통계 학적 정보이며 지리적 위치에 따라 사람의 주소입니다. 나는 그들의 나이를 포착하고 예를 들어 특정 거리에 사는 사람들의 중앙값을 찾아야합니다.

데이터 세트는 150,000 레코드이고 각 레코드에는 26 개의 필드가 있습니다. 많은 필드는 주소의 세그먼트이며 다른 필드는 숫자, 나이, 거리 번호 및 이와 비슷한 것입니다.

그래서 내가해야 할 일은 라인을 통해 읽은 다음 레코드의 특정 필드가 특정 조건을 충족하면 레코드의 필드를 캡처하여 배열에 저장하여 중간 값을 계산해야합니다 예를 들어 "Oak Street"에 사는 사람들의

나는 조건부 논리를 가지고 있고 정렬 작업을 할 수 있지만 ifstream 객체를 인스턴스화 한 다음 파일 자체에서 읽는 것과 같은 C++의 iostream 객체에 불편합니다.

오우 데이터가 쉼표로 구분 된 값 파일임을 잊어 버렸습니다. 공백으로 구분 된 입력의

using namespace std; 
ifstream file; 
string line; 
while(getline(file, line)) { 
    istringstream stream(line); 
    string data[3]; 
    for(int ii = 0; ii < sizeof data/sizeof data[0]; ++ii) 
     if(!getline(stream, data[ii], ',')) 
      throw std::runtime_error("invalid data"); 
    // process data here 
} 

(원본 답) : 쉼표로 구분 된 입력의

+2

그 중 어떤 부분에 문제가 있습니까? –

+0

또한 파일 형식에 대한 자세한 정보를 제공합니다. 예상 출력을 입력하십시오. – RageZ

+0

직접 작업을위한 작은 임시 솔루션을 만들려고했습니다. – ihtkwot

답변

3

이 방법은 성능에 대한 상품을 이길 수 없습니다

using namespace std; 
ifstream file; 
string line; 
while(getline(file, line)) { 
    int datum1; 
    string datum2; 
    double datum3; 
    istringstream stream(line); 
    if(!(line >> datum1 >> datum2 >> datum3)) 
     throw std::runtime_error("invalid data"); 
    // process data here 
} 

, 그러나 희망 그들이있어 상당히 신뢰성 있고 이해하기 쉽습니다.

+0

John에게 감사드립니다. – ihtkwot

+0

데이텀을 쉼표로 구분하면'line >> datum1 >> datum2 >> datum3'이 작동합니까? –

+0

아니요, 필드가 쉼표로 구분 된 경우 지금 게시하고있는 코드의 두 번째 비트를 참조하십시오. –

1

이것은 SQL 라이트 스타일의 임베디드 데이터베이스에서 완벽한 문제로 들립니다. 그런 다음 휠을 다시 작성할 필요없이 표준 SQL 기능을 여러 개 가질 수 있습니다.

+0

SQL은 높은 학습 곡선을 가지고 있습니까? 저는 풀 타임으로 일하며 풀 타임으로 학교에 다니기 때문에 현재 어떤 수업에서든 SQL을 배우지는 못합니다. 그러나 저는 그것을 측면에 맞추려고 노력할 수 있습니다. – ihtkwot

+0

지금보고있는 것에 적합하지 않습니다. – rerun

+0

두 명의 사람들이 사무실에서하는 일이 많다는 것을 알고 있기 때문에 SQL을 조사해야 할 것입니다. 그러나 내가 얼마나 능숙한지 확신 할 수 없기 때문에 조금 속도를 높이면됩니다. 나는 그들을 도울 수 있을지 모른다. – ihtkwot

관련 문제