2010-08-06 6 views
0

나는 엑셀 시트에 거대한 데이터를 가지고있다. 해당 데이터의 구조를 준비하고 데이터를 채울 필요가 있습니다. 나는 2 가지 방법으로 그것을 할 수있다.거대한 구조체를 정적으로 채우는 것

  1. 정적 struct x a[] = { }

  2. 가 메모리를 동적으로 할당 및 함수를 작성하여 구조를 작성 구조체 초기화 동안 구조를 채운다.

구조가 약간 복잡해 보입니다. 이 구조체는 어떻게 채울 수 있습니까?

region name, list of languages supported, list of encodings supported

가 어떻게 같은 데이터의 구조를 정의하고 그것을 채우기 않습니다 엑셀 시트의

한 기록은 같다?

답변

0

데이터가 모두 동적 인 경우 1을 수행 할 수 없습니다. 코드에서 구조체의 초기화에 넣는 것은 모든 데이터를 Excel 파일의 소스 파일에 복사하는 것입니다. 나는 이것이 거대하다고 말한 이후로 이것이 가능하지 않다고 생각합니다. 옵션 2를 사용해야합니다. 물론 스프레드 시트를 읽을 수있는 데이터베이스 라이브러리를 사용할 수있는 옵션이 없으면 가장 좋은 방법 일 수 있습니다.

+0

감사 방패는 큰 의미 데이터는 60 행오고있다 .. 여전히 동적으로 더 나은 옵션은 당신에게 일이 충전 구조를 않습니다. 또한이 목록은 앞으로 업데이트 될 수 있습니다. 구조체 초기화시 정적으로 채우는 단점은 무엇입니까? – Teja

+0

@Teja 예 동적 인 경우 목록을 업데이트 할 수 있습니다. – bshields

0

모든 행에 3 개의 열만 있으면 CSV 파일로 저장하십시오. 3 개의 변수가 모두 char * 인 구조를 3 자 배열로 선언하십시오. 그런 다음 파일을 엽니 다. fgets를 사용하여 모든 행을 읽습니다. 배열의 읽기 문자열에 sscanf를 사용합니다. 읽기 값의 크기를 사용하여 메모리를 할당하고 구조에 동일한 값을 저장합니다.

0

런타임에 데이터가 변경되지 않으면 절대 정적 초기화를 사용하고 const 개체를 선언해야합니다. 현대적인 플랫폼에서는 운영 체제가 파일 시스템 캐시의 실행 파일 복사본과 페이지를 공유하게됩니다. 즉, 실제 메모리를 사용하지 않습니다 (메모리가 부족하면 페이지를 삭제하고 다시 읽을 수 있음). 필요한 경우 실행 파일에서 가져오고 디스크에 보관/스왑하지 않아도됩니다.

+0

고마워요! 나는 기억에 대해 거의 염려하지 않았다. 이제 나는 분명하다. 구조체를 찾으려고합니다. 요구 사항은 다음과 같습니다. 한 영역에는 여러 언어가 있으며 각 언어에는 하나 이상의 다중 인코딩이있을 수 있습니다. 각 영역은 하나 이상의 글꼴 파일을 가질 수 있습니다. – Teja

0

개발중인 플랫폼에 대해 많이 말하지 않았습니다. 컴파일러는 C99의 준수 인 경우는 초기화 할 수있는 당신의 이름을 이니셜로 struct 자체가이 작업을 수행 할 때 가장 아마도 개인의 초기화하는 매크로를 작성하는 것이 매우 동일한 경우

char *fullname0 = ... 
char *phone = ... 
. 
struct x a[] = { 
[0] = { .fname = fullname0, .phn = phone } 
[1] = { .fname = fullname1, .phn = phone } 
}; 

을 다음과 같이 struct.

#define X_INITIALIZER(NAME, PHONE) { .fname = NAME, .phn = PHONE } 
+0

이 작업을 수행하면 CSV의 데이터를 필수 형식으로 변환하는 것이'sed 's/^/X_INITIALIZER (/; s/$ /) /''처럼 간단 해집니다. 선행 처리기의 "stringify"연산자 인'# '가이 일에 유용 할 수 있습니다. –

1

귀하의 의견에 따르면, 사용자는 60 행만 사용하고 있습니다. 그것은 거대하지 않다! 타이핑해라! :-)

하지만 컴퓨터가 지루한 작업을 수행하고 데이터가 진화하면서 최신 상태를 유지하도록 더 똑똑하게 일하고 DRY 규칙을 조금 적용 해 보겠습니다. 필자가 제안하는 것은 별도의 프로그램을 작성하여 Excel 시트에서 데이터를 추출하고 C 헤더 파일을 생성하여 정의를 #include 수 있습니다. 그런 다음 makefile 규칙을 사용하여 소스에서 구조체 정의를 다시 빌드 할 수 있습니다. (당신이 일하는 규칙에 따라 C가 아닌 개발자 툴인 것처럼 도우미 프로그램을 만들 수 있습니다.)

마지막주의 사항; 많은은 구조체의 배열 (구조 배열 등을 포함 할 수 있음)로 정적 데이터를 생성하는 것이 연결 목록을 만드는 것보다 간단합니다.

+0

네, 당신 생각이 마음에 들어요. 하지만 시간이 좀 걸릴 수 있습니다 :-(하지만. 내가 엑셀 ​​시트에서 추출하고 헤더 파일을 생성하는 방법을 탐구합니다. – Teja

+0

모두에게 도움을 주셔서 감사합니다! – Teja

-2

다음과 같은 파이썬 스크립트를 사용하여 CSV에서 C 구조체를 생성 할 수 있습니다

import csv, sys 
csvfile = open("eclipses.csv", "rb") 
dialect = csv.Sniffer().sniff(csvfile.read(1024)) 
print "Dialect:", dialect 
csvfile.seek(0) 
spamReader = csv.reader(csvfile, dialect=dialect) 
writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, lineterminator=",\n") 
writer.writerows(spamReader) 
관련 문제