[펄] 해시를 이용하여 특정조건에 부합하는 것들의 합을 구하기
글쓴이: momo7 / 작성시간: 금, 2013/10/25 - 10:10오후
안녕하세요. 아래와 같은 데이터가 있습니다. 포인트, 동일년도 기준으로 특정조건을 만족시키는 기온의 합산을 할려고 하는데,
자꾸 제대로 된 결과값을 보여주질 않습니다. 아래 코드보시고 힌트좀 주실수 있습니까?
** 해시만 가지고 두가지 조건을 동시에 만족시키는 것을 잘 표현하기 어려워 for문을 더 썼습니다.
/데이터/
포인트 년월일 기온
90 19910101 10
90 19910102 20
90 19910103 19
91 19910101 15
91 19910102 19
91 19910103 25
90 19920101 30
90 19920102 30
90 19920103 10
91 19920101 30
91 19920102 20
91 19920103 10
/기대하는 결과/
90 1991 3
91 1991 8
90 1992 24
91 1992 14
#!/usr/bin/env perl use strict; use warnings; use 5.010; my($i,$point,$year,@sum,%sum,@arr); for ($i=1991; $i<=1992;$i++) { open my $fh, '<', "aws.txt"; while (<$fh>) { @arr=split; $point = $arr[0]; $year = substr $arr[1], 0, 4; if ($year = $i){ if ($arr[2] >= 18.0){ $sum{$point}{$year}{d} += ($arr[2] - 18); } } } foreach(sort {$a<=>$b} keys(%sum)) { say join("\t",$_, $i, $sum{$_}{$year}{d}); } }
Forums:
텍스트 파일로부터 바로 답을 뽑아낼 수도
텍스트 파일로부터 바로 답을 뽑아낼 수도 있겠지만,
DB에 테이블로 읽어들여서 SQL 쿼리 하나로 해결할 수도 있습니다.
DB는 임베디드엔진인 SQLite를 쓰고, perl을 몰라서 python으로 해봤습니다.
python 코드만 perl 코드로 바꾸면 되는데 제 능력 밖이네요..
우선 aws_tbl이라는 테이블을 만들고 aws.txt를 읽어들여 테이블을 채웁니다.
aws_tbl은 SQLite DB 파일인 aws.db 안에 만드는데, aws.db 파일은 없으면 저절로 만들어집니다.
이렇게 테이블이 준비되면 SQL 쿼리 하나로 원하는 결과를 얻을 수 있습니다.
다른 조건으로 데이터를 가공하고 싶으면 쿼리만 적당히 바꾸면 됩니다.
http://gentooboy.tistory.com/136 를 참고했고,
테스트는 CentOS-5.10의 python-2.4에서 했습니다.
인터넷 대충 뒤셔서 perl로 바꿔봤습니다. 동작은
인터넷 대충 뒤셔서 perl로 바꿔봤습니다. 처음해본 것이니 코드는 의심스러우나 어쨌든 동작은 되네요.
작성중이신 코드를 보완할 방법을 질문하신 마당에 제가 방향이 맞지 않는 댓글만 달았습니다만,
이렇게 DB와 SQL에 의지하는 방법도 있음을 보이고 싶었습니다.
역시 CentOS 5.10에서 테스트했고, 실행결과는 아래와 같이 나옵니다.
감사합니다
도움이 많이 되었습니다
작성하시던 코드를 수정해봤습니다. 수정사항은 3가지
작성하시던 코드를 수정해봤습니다.
수정사항은 3가지 였고, [1],[2],[3]으로 주석 달아놨습니다.
아래 코드는 외부의 하드코딩된 for loop을 없앤
아래 코드는 외부의 하드코딩된 for loop을 없앤 것입니다.
계기가 생긴 김에 perl을 좀 살펴보느라고 해 봤습니다.
한번더 돌려야하는군요 잘 알겠습니다
감사합니다
한번더 돌려야하는군요 잘 알겠습니다
감사합니다
댓글 달기