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 하냐고...
-
달콤(Dalkom)은 리브레오피스에서 hwp 문서를 보기 위한 확장 기능입니다. libhwp 와 연동에 성공하여 hwp 문서에 있는 문자를 리브레오피스에서 볼 수 있습니다. 시간상의 이유 때문에 우선적으로 문자만 작업했습니다. 렌더링을 리브레오피...
-
그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유 우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다 . 이렇게 개떡 같은 게 오픈소스입니다. 전 과거 libhwp 하냐고...
-
제가 원래 개발자가 아니라 원래가 일반 사용자였습니다.과거 MS윈도우 품질이 개떡같아서 유닉스 사용하다가 유닉스가 비싸고 망해서 리눅스를 사용하고 있는 거고 리눅스 품질이 지금은 우수하지만 예전에는 문제가 진짜 많았죠. 그렇게 리눅스를 지금까지 사용해...
댓글 없음:
댓글 쓰기