Download presentation
Presentation is loading. Please wait.
1
Ruby Programming Date, scan, 웹 처리 한국어 정보의 전산 처리
2
날짜 처리 문제 날짜와 관련된 연산은 매우 골치 아픈 주제임.
지구의 공전 주기가 딱 떨어지는 정수가 아니기 때문에 윤년을 고려해야 함. (4년에 한 번, 100년에 한 번, … ) 1년을 구성하는 각 달의 날 수가 같지 않음. 입출력 문제: 날짜를 표시하는 방법이 나라마다 다름. 참고: Janssens가 만든 command line tool dseq (cf. seq) 이런 복잡한 문제를 다루어 줄 class를 프로그래밍 언어 차원에서 제공함. ruby에서 Date class를 사용하려면: require ‘date’
3
Date class의 기본 기능 요일 알아보기: x.wday
Date object 생성: x = Date.new(연, 월, 일) 요일 알아보기: x.wday x + 정수: x로부터 정수 날 뒤의 Date object 반환 정수값 반환: 0(일), 1(월), 2(화), … , 6(토) x - 정수: x로부터 정수 날 앞의 Date object 반환 x = Date.new(1970,2,15) ; x # x - y (둘 다 Date object인 경우): 두 날 사이의 날 수 반환 날짜뿐 아니라 시간까지 고려한 연산도 가능. 유리수 반환. y = Date.today ; y - x #17262/1 x.upto(y){|date| … } # x부터 y까지의 enumrator 생성
4
달력 만들기 (calendar_month.rb)
start_day = Date.new(ARGV[0].to_i, ARGV[1].to_i, 1) 그 달의 달력을 출력 사용자가 command line argument로 연, 월 입력하면 $,="\t" print "\t" * start_day.wday #첫날의 요일에 따라 탭 출력 print "일","월","화","수","목","금","토\n" start_day.upto(end_day) do |date| #첫날부터 말일까지 end_day = start_day.next_month-1 #그 달의 말일 print "\n" if date.saturday? #토요일이면 줄바꿈 출력 print date.day, "" #날짜와 탭 출력 end
5
달력 외양 향상시키기 컬러 출력: colorize gem 이용
(sudo) gem install colorize (Linux에서는 sudo 필요) 일요일을 적색으로 출력하려면: 문자열.red 1년치 달력 출력: start_day를 적절히 조정하면서 1달치 달력 출력 루틴을 12번 반복 첫째 주의 앞의 빈 칸을 앞 달 날들로 채우고 마지막 주의 끝의 빈 칸을 다음 달의 날들로 채우기 calendar.rb 참조
6
음력 처리 LunarSolarConverter.rb를 require하여 이용
calendar.rb에 음력 날짜 추가하기 $,="-" ; print l.lunarYear, l.lunarMonth, l.lunarDay l = LunarSolarConverter.new.SolarToLunar(Solar.new(1970, 2, 15)) if date.saturday? #토요일이면 cvt = LunarSolarConverter.new #음력-양력 변환기 object 생성 end #음력 월, 일, 줄바꿈 출력 print lunar.lunarMonth,"-",lunar.lunarDay,"\n" lunar = cvt.SolarToLunar(Solar.new(date.year,date.month,date.day)) calendar_lunar.rb 참조
7
파일 한꺼번에 읽기 파일을 열어서 그 안의 문자열들을 읽을 때, 대개 라인을 한 줄씩 읽는 것이 보통임.
File.open(filename).each do |line| … end lines = File.open(filename).readlines 파일 전체를 한꺼번에 읽는 것도 가능 str = File.read(filename) File.open에서는 “r:UTF-8”처럼 인코딩을 명시하나 File.read에서는 :encoding=>'utf-8'과 같이 함. UTF-8이 default이므로 UTF-8일 때는 안 써도 됨.
8
scan 메소드로 정규표현 처리 문자열.scan(/정규표현/) : 문자열 내에서 정규표현에 match되는 부분들을 찾아서 Array로 만들어 반환 정규표현 내에 group(괄호로 묶은 부분)이 없으면 단순 문자열들의 Array를 반환. group이 있으면 각 match 내의 group에 해당하는 부분들로 이루어진 Array들의 Array를 반환. "abc xyz 가나다".scan(/\w+/) #["abc", "xyz", "가나다"] #[["John", "90"], ["Mary", "80"], ["Bill", "70"]] str="John,90;Mary,80;Bill,70" ; str.scan(/(\w+),([0-9]+)/) str.scan(/(\w+),([0-9]+)/).each{|name,score| ... }와 같이 정규표현 내의 각 group을 변수로 직접 받아서 사용할 수 있음.
9
csv 파일을 scan 메소드로 처리하기 학생들의 5과목 성적 들어 있는 파일에서 총점, 평균 내기
File.read(ARGV[0]) #파일 전체를 읽어서, scan하여 $, = "\t" ; $\ = "\n" #필드 구분자, 레코드 구분자 지정 .each do | name, kor, eng, math, phy, che, job | sum = kor.to_i + eng.to_i + math.to_i + phy.to_i + che.to_i #정규표현 내의 7개의 group을 7개의 변수로 지칭 end print name, kor, eng, math, phy, che, sum, avg, job avg = sum / 5.0 라인 단위로 읽어서 split으로 분리하는 것과 같은 효과.
10
웹에서 파일 읽어 오기 (uri.rb) 헤더 파일 가져오기: require 'open-uri'
open(url) do |f| #url을 열어서 f로 지칭. read로 파일 전체 읽기 f.read.scan( /<a href="(.*?)"/ ).each do |link| #정규표현 /<a href="(.*?)"/ 내의 괄호 부분에 매치되는 것들을 link로 지칭 puts link #출력 end f.each_line으로 한 라인씩 읽어들일 수도 있음.
11
웹에서 파일 읽어 오기 2 (http.rb) url = url[7..-1] if url.start_with? "http://"
domain, sub = url.split("/",2) #url을 domain과 나머지로 분리 url = url[7..-1] if url.start_with? " url=ARGV[0] Net::HTTP.start(domain) do |http| #http 접속 require "net/http" #헤더 파일 불러오기 http.get("/"+sub).body #그 domain 내의 특정 파일 읽어오기 .scan( /<a href="(.*?)">/ ).each do |link| #scan으로 검색 end puts link net/http가 domain에 접속하여 파일을 읽어오는 2 단계로 되어 있는 데 비해, open-uri는 이를 한 단계로 축약.
Similar presentations