Translate

2018년 7월 21일 토요일

파일의 각 라인을 더하는 예제 코드

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

댓글 없음:

댓글 쓰기

응용 어플 끝글자 버그 잡는 거 진짜 개쉽습니다

그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유 우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다 . 이렇게 개떡 같은 게 오픈소스입니다. 전 과거 libhwp 하냐고...