2011년 1월 6일 목요일
파일 이름: data
1 2 3
4 5 6
7 8 9
루비 소스 파일 이름: test.rb
#!/usr/bin/ruby
# ruby 1.9.1 에서 테스트 했음
require 'csv'
if ARGV.length != 1
puts "CSV file is required."
exit
end
@sum = [0,0,0]
# col_sep 는 column separator
# 콤마로 바꾸기 위해서는 col_sep:","
csv = CSV.open(ARGV[0], "r", col_sep:" ")
csv.each do |row|
@sum[0] += row[0].to_i
@sum[1] += row[1].to_i
@sum[2] += row[2].to_i
end
p @sum
결과
$ ruby test.rb data
[12, 15, 18]
csv 연산
공부할 겸 만들어봤습니다. 신버전입니다.
#!/usr/bin/ruby
# ruby 1.9.1 에서 테스트 했음
if (ARGV.length != 3) or
((ARGV[1] != '+') and (ARGV[1] != '-') and
(ARGV[1] != '*') and (ARGV[1] != '/'))
puts "Usage: $ ruby csv1 op csv2"
puts "$ ruby csv1 + csv2"
puts "$ ruby csv1 - csv2"
puts "$ ruby csv1 \\* csv2"
puts "$ ruby csv1 / csv2"
exit
end
f1 = File.open(ARGV[0])
op = ARGV[1]
f2 = File.open(ARGV[2])
while(row1 = f1.gets and row2 = f2.gets)
row1 = row1.split
row2 = row2.split
@sum = [0,0,0]
# %Q[....] 안에 있는 요거 ===> #{op} row2[0].to_i 주석문 아닙니다.
cmd = %Q[
@sum[0] = row1[0].to_f #{op} row2[0].to_i
@sum[1] = row1[1].to_f #{op} row2[1].to_i
@sum[2] = row1[2].to_f #{op} row2[2].to_i
]
eval(cmd)
puts "#{@sum[0]} #{@sum[1]} #{@sum[2]}"
end
결과
$ cat data1 data2
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
$ ruby test.rb data1 + data2
11.0 13.0 15.0
17.0 19.0 21.0
23.0 25.0 27.0
$ ruby test.rb data1 - data2
-9.0 -9.0 -9.0
-9.0 -9.0 -9.0
-9.0 -9.0 -9.0
$ ruby test.rb data1 \* data2
10.0 22.0 36.0
52.0 70.0 90.0
112.0 136.0 162.0
$ ruby test.rb data1 / data2
0.1 0.181818181818182 0.25
0.307692307692308 0.357142857142857 0.4
0.4375 0.470588235294118 0.5
또 다른 코드
#!/usr/bin/ruby
# ruby 1.9.1 에서 테스트 했음
# 할일 (TO DO)
# 우선 순위, 사칙 연산 파서
# for 문을 사용하여 column 을 현행 3에서 n 으로 확장할 것.
# 예외처리.
# SSV : Space Separated Value
class SSV
def initialize(file)
@f = File.open(file)
end
# op 연산자, operand 피연산자
def compute(op, operand)
# if 를 수식자(modifier)로 사용하면 코드가 더 간결해질 수 있지만
# 생각하기 귀찮아서 Copy & Paste 신공으로 처리
if operand.class == SSV
while(row1 = @f.gets and row2 = operand.gets)
row1 = row1.split
row2 = row2.split
@sum = [0,0,0]
cmd = %Q[
@sum[0] = row1[0].to_f #{op} row2[0].to_i
@sum[1] = row1[1].to_f #{op} row2[1].to_i
@sum[2] = row1[2].to_f #{op} row2[2].to_i
]
eval(cmd)
puts "#{@sum[0]} #{@sum[1]} #{@sum[2]}"
end # end of while
else
while(row1 = @f.gets)
row1 = row1.split
@sum = [0,0,0]
cmd = %Q[
@sum[0] = row1[0].to_f #{op} operand.to_f
@sum[1] = row1[1].to_f #{op} operand.to_f
@sum[2] = row1[2].to_f #{op} operand.to_f
]
eval(cmd)
puts "#{@sum[0]} #{@sum[1]} #{@sum[2]}"
end # end of while
end # end of if
end # end of compute
def gets
@f.gets
end
end
if __FILE__ == $0
if (ARGV.length != 3) or
((ARGV[1] != '+') and (ARGV[1] != '-') and
(ARGV[1] != '*') and (ARGV[1] != '/'))
puts "Usage: $ ruby csv1 op csv2"
puts "$ ruby csv1 + csv2"
puts "$ ruby csv1 - csv2"
puts "$ ruby csv1 \\* csv2"
puts "$ ruby csv1 / csv2"
puts "$ ruby csv1 + 88"
puts "$ ruby csv1 - 12.1"
puts "$ ruby csv1 \\* 5"
puts "$ ruby csv1 / 9.1"
exit
end
ssv1 = SSV.new(ARGV[0])
op = ARGV[1]
# 내공이 부족한 관계로
# 파일 이름이 숫자로 시작하면 안 됨.
# 숫자 뒤에는 영문자 등이 오면 안 됨.
if ARGV[2] =~ /^[0-9]/
ssv1.compute(op, ARGV[2])
else
ssv2 = SSV.new(ARGV[2])
ssv1.compute(op, ssv2)
end
end
10여 년간 한글 문제 해결도 못하고 있는데 오픈소스 이 딴거 개나 줘버리라고 하세요. 오픈소스 개발자님, 관계자님 제가 하는 일에 제발 신경 끄세요. 도움 주지 마세요. 시간 빼앗겨 방해만 됩니다.
Translate
2018년 7월 21일 토요일
피드 구독하기:
댓글 (Atom)
응용 어플 끝글자 버그 잡는 거 진짜 개쉽습니다
그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유 우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다 . 이렇게 개떡 같은 게 오픈소스입니다. 전 과거 libhwp 하냐고...
-
인터넷에서 웹 브라우저로 파일을 받으면 서버 측의 잘못된 설정으로 인하여 한글 파일 이름이 이상하게 되는 경우가 많다. cp949 코드가 utf-8 로 둔갑된 경우 사용자 컴퓨터 환경이 utf-8 환경이라면 그 파일 이름 자체가 utf-8 이기 ...
-
예전에 dasom 개발하면서 많은 글을 작성했었는데 당시 drupal 로 홈페이지를 사용했었는데 drupal 관리를 못해서 데이터를 다 날려먹었습니다. 복구가 안 되요. 그래서 그 때부터 그냥 블로거에 글쓰고 있는 겁니다. 블로거는 구글에서 관리를 하...
-
그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유 우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다 . 이렇게 개떡 같은 게 오픈소스입니다. 전 과거 libhwp 하냐고...
댓글 없음:
댓글 쓰기