seders.gms : SED를 사용한 ERS 메가 슬롯터 조작

설명

데이터 파일은 다른 사람이 읽을 수 있는 형식이 아닌 경우가 많습니다.
프로그램 및/또는 변환이 이루어져야 합니다. 아래의 예
쉼표로 구분된 입력 출력 행렬을 조작하는 방법을 보여줍니다.
형태. 샘플 파일은 다음과 같습니다.

BAS1,1 낙농장,2 가금류 계란,3 육류 동물,4 livestckmisc, ... 512 Wat2,513 Air2,Total,
1 낙농장,0,0,265.7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ... 0,0,0,0,0,0,0,0,0,26452.6,
2 가금류계란,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,523.8,0,0, ... 0,0,0,0,0,0,,17623.5,
...
503 공기2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.2,0.7,1.7,0.3, ... 8,18859.6,470.4,0,0.5,5.4,33699.3,
합계,18728.2,14814.9,50839.5,2670.9,2693.7,3421.0,1831, ... ,3593.4,12052.2,6520145.5,

이 파일은 원본 파일에서 원시 파일을 가져오는 일상적인 프로세스의 결과입니다.
웹 사이트를 방문하고 행과 열에 맞춤 라벨을 첨부하세요.
( https://www.bea.gov/industry/io_benchmark.htm ).  행과
열의 형식은 '<숫자> 공백 <텍스트>'입니다. 일부 행에는
삭제되었으며 행 레이블의 <숫자>가
해당 열 레이블.  Air2라는 행에는 번호가 있습니다.
503인 반면 Air2 열의 번호는 513입니다. 집계 이후
열 번호로 수행되므로 행 번호를 다시 할당해야 합니다.
열 순서를 사용하십시오. 또한 세 개의 행 레이블이 있습니다.
일치하는 열 레이블이 없습니다.

마지막으로 행렬은 513 크기에서
훨씬 작은 크기.

우리는 유닉스 도구 SED를 사용하여 텍스트 파일을 형식으로 조작합니다.
메가 슬롯에서 읽기에 적합합니다. SED에 대한 자세한 내용은 SED를 참조하세요.
책.

소형 모델 유형 :메가 슬롯


카테고리 : 메가 슬롯 모델 라이브러리


메인 파일 : 메가 슬롯gms   포함: f001.inc

$title SED를 사용한 ERS 데이터 조작(SEDERS,SEQ=297)

$onText
데이터 파일은 다른 사람이 읽을 수 있는 형식이 아닌 경우가 많습니다.
프로그램 및/또는 변환이 이루어져야 합니다. 아래의 예
쉼표로 구분된 입력 출력 행렬을 조작하는 방법을 보여줍니다.
형태. 샘플 파일은 다음과 같습니다.

BAS1,1 낙농장,2 가금류 계란,3 육류 동물,4 livestckmisc, ... 512 Wat2,513 Air2,Total,
1 낙농장,0,0,265.7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ... 0,0,0,0,0,0,0,0,0,26452.6,
2 가금류계란,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,523.8,0,0, ... 0,0,0,0,0,0,,17623.5,
...
503 공기2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.2,0.7,1.7,0.3, ... 8,18859.6,470.4,0,0.5,5.4,33699.3,
합계,18728.2,14814.9,50839.5,2670.9,2693.7,3421.0,1831, ... ,3593.4,12052.2,6520145.5,

이 파일은 원본 파일에서 원시 파일을 가져오는 일상적인 프로세스의 결과입니다.
웹 사이트를 방문하고 행과 열에 맞춤 라벨을 첨부하세요.
( https://www.bea.gov/industry/io_benchmark.htm ).  행과
열의 형식은 '<숫자> 공백 <텍스트>'입니다. 일부 행에는
삭제되었으며 행 레이블의 <숫자>가
해당 열 레이블.  Air2라는 행에는 번호가 있습니다.
503인 반면 Air2 열의 번호는 513입니다. 집계 이후
열 번호로 수행되므로 행 번호를 다시 할당해야 합니다.
열 순서를 사용하십시오. 또한 세 개의 행 레이블이 있습니다.
일치하는 열 레이블이 없습니다.

마지막으로 행렬은 513 크기에서
훨씬 작은 크기.

우리는 유닉스 도구 SED를 사용하여 텍스트 파일을 형식으로 조작합니다.
메가 슬롯에서 읽기에 적합합니다. SED에 대한 자세한 내용은 SED를 참조하세요.
책.

Doufherty, D 및 Robbins, A, SED 및 AWK. 오라일리 & 어소시에이츠,
세바스토볼, 1997.

이 문제의 원인은 다음과 같습니다: Agapi Somwaru, ERS, US Department of
농업, 워싱턴 DC

키워드: 데이터 조작, 스트림 편집기, 쉼표로 구분된 값
$offText

$set 원시 f001.inc

* 1. 열 헤더를 추출하고 열번호에 쓰기
$onEcho > sedscript
# 첫 번째 줄 앞에 삽입
1i\
$off목록
# 첫 번째 토큰을 버리세요
s/^[^,]*,//
# 마지막 항목을 삭제하고 그 뒤에 쉼표가 옵니다.
s/,[^,]*,$//
# 쉼표를 줄바꿈으로 대체
초/,/\
/g
# 첫 번째 줄 이후 종료
1q
$offEcho

$call sed -f sedscript %raw% > 열번호

* 2. 행 이름을 추출하여 rowname에 씁니다.
$onEcho > sedscript
# 첫 번째 줄 앞에 삽입
1i\
$off목록
# 첫 번째 줄 삭제
1일
# 마지막 줄 삭제
$d
# 행 번호 제거
s/^[0-9]* //
# 쉼표 뒤의 모든 내용을 제거합니다.
s/,.*$//
$offEcho

$call sed -f sedscript %raw% > 행 이름

* 3. 행렬을 준비하고 행 이름과 열 번호를 사용하여 mat1에 씁니다.
$onEcho > sedscript
# 첫 번째 줄 앞에 삽입
1i\
$offListing\
$onDelim
# 후행 쉼표 삭제
초/,$//
# 첫 번째 줄의 숫자 다음에 나오는 열 이름을 제거합니다.
1초/ [^,]*,/,/g
# 다른 행의 숫자를 제거합니다.
1!s/^[^ ]* //
#마지막 줄 뒤에 삽입
$a\
;
$offEcho

$call sed -f sedscript %raw% > mat1

* 4. 변환된 데이터를 읽고 몇 가지 기본 점검을 수행합니다.
세트
   j '열 번호' /
$ 열번호 포함
                      /
   행 '행 이름' /
$ 행 이름 포함
                      /
   col '열 이름' /
$ call sed -e "s/^[0-9]* //" 열번호 > 임시
$ 온도 포함
                      /
   jmap(j,col) '번호 이름 맵'
/
$ onDelim
$ 열번호 포함
$ 할인Delim
/;

테이블 mat1(*,*) '행 및 열 합계를 포함한 데이터'
$include mat1
;

매개변수 rowtot(행), rowdiff(행), coltot(j), coldiff(j);

rowtot(행) = sum(j, mat1(행,j));
coltot(j) = sum(행, mat1(행,j));
rowdiff(행) = rowtot(행) - mat1(행,'합계');
coldiff(j) = coltot(j) - mat1('total',j);

* rowdiff, coldiff를 표시합니다.

* 총계가 올바른지 확인하고 반올림에 유의하세요!
매개변수
   rowerr(row) '상대 행 오류'
   colerr(j) '상대 열 오류';

rowerr(행) = round(rowdiff(행)/(1 + rowtot(행)),1);
colerr(j) = round(coldiff(j)/(1 + coltot(j)),1);

디스플레이 rowerr, colerr;

abort$(card(rowerr) + card(colerr)) '데이터 오류 가능성이 있음';

* 행 및 열 합계 업데이트
mat1(행,'합계') = rowtot(행);
mat1('합계',j) = coltot(j);

Set zerorows(row) '총계가 0인 행';
zerorows(행) = rowtot(행) = 0;

0행을 표시합니다.

* 5. 추가 행 이름을 찾아 OthSLGentpr 행에 추가
Set rowx(*) '추가 행 이름';
rowx(행) = 예 - col(행);
행x를 표시;

mat1('OthSLGentpr',j) = mat1('OthSLGentpr',j) + sum(rowx, mat1(rowx,j));
mat1(행x,j) = 0;

* 6. 행 이름을 적절한 열 번호에 매핑하고 mat2에 저장합니다.
별칭(i,j);

매개변수 mat2(i,j) '열 번호를 사용하는 행렬';
mat2(i,j) = sum(jmap(i,col), mat1(col,j));

* 7. 최종 집계 매핑 및 테스트
세트
   Iagg 'IC 부문 집합'
        / ADRY 'DAIRYFARPRD', AOMT 'POULTRY', ACTL 'MEATANIM'
          ACOT 'COTTON', AFOD 'FOODGRAIN', AFED 'FEEDGRAIN'
          ATOB '담배', AFRT '과일 및 TREENUTS', AVEG 'VEG AND GREENHOUSE'
          ASUG 'SUGARCROPS', AOCR 'OTHERCROPS', AOIS 'OILBEARCROPS'
          ACMP '가축 생산 PROC', AOMP '기타 고기 생산 PROC', ADRP '유제품 생산 PROC'
          AFOP 'FOOD GRAIN PROC', AFEP 'FEED GRAIN PROC', ASUP 'SUGAR PROD PROC'
          AFSH 'FISH PRE PROC', AOIP 'OIL PROD PROC', AFRP 'FRUIT PROD PROC'
          ABEV 'BEVERAGES', ATOP 'TOBACCO PROC', AFDP '기타 식품 PROC'
          ATEX 'TEXTILE', AAPR 'APPAREL', ALTP 'LEATHER PROD PROC'
          AACH 'AGRCHEMICALS', AFFS '산림낚시 AGR SERV', AMNF 'MANUFACTURING'
          ASRV '서비스' /
   IaggMap(Iagg,J) '집계 매핑'
        / 아드리. (1)
          AOMT. (2)
          ACTL. (3,4)
          ACOT. (5)
          AFOD. (6)
          AFED. (7)
          ATOB. (9)
          AFRT. (10,11)
          AVEG. (12,17)
          ASUG. (13)
          AOCR. (8,14)
          AOIS. (15)
          AFFS. (16,18*21)
          아아아. (30,179,180,181)
          ACMP. (53,54)
          AOMP. (55)
          ADRP. (56*60)
          AFSH. (61,66)
          AFRP. (62,64*65,67)
          AFOP. (69*71,76*78,96,97)
          AFEP. (72*75)
          ASUP. (79,82,80)
          ABEV. (83*88,93)
          AOIP. (89*92,94)
          AFDP. (63,68,81,95,98)
          꼭대기. (99*102)
          ATEX. (103*114)
          AAPR. (115*127)
          ALTP. (209*217)
          AMNF.(22*29,31*52,128*178,182*208,218*407)
          ASRV.(408*513) /;

세트
   iaggTest(Iagg) '매핑되지 않은 집계 섹터'
   JZero(j) '매핑이 없는 섹터'
   JTest(j) '여러 매핑이 있는 섹터';

iaggtest(iagg) = sum(j$IaggMap(Iagg,j), 1) = 0;
JZero(j) = sum(iagg$IaggMap(Iagg,j), 1) = 0;
JTest(j) = sum(iagg$IaggMap(Iagg,j), 1) > 1;

iaggtest, jzero, jtest를 표시합니다.

abort$(card(iaggtest) +card(jzero) +card(jtest)) '집계 매핑이 잘못되었습니다.';

* 8. amat로 집계하고 모든 데이터를 gdx 파일에 저장합니다.
별칭(iagg,jagg), (j,jj);

매개변수 amat(iagg,jagg) '집계 테이블';
amat(iagg,jagg) = sum((j,jj)$(iaggmap(iagg,j)*iaggmap(jagg,jj)), mat2(j,jj));
디스플레이 amat;