Ruby | csv_box를 사용하여 CSV를보다 쉽게 ​​만들고 싶습니다.

7112 단어 루비

하고 싶은 일



CSV 출력은 안건마다 수제로 만드는 경우가 많다고 생각합니다. 업무에 관련된 서비스라면 열수도 많아, 정렬이나 조건에 의한 열의 추가·삭제로 버그가 일어나기 쉽지요.

문제는 데이터 부분의 출력과 열의 배열이 직접 연결되어 있기 때문에 분리하여 관리하기 쉽다고 생각했습니다.
require 'csv'

Book = Struct.new(:id, :title, :price)
books = [Book.new(1, 'How to cook delicious meals', 1500), Book.new(2, '10 tips to lose weight', 250)]

table = CSV::Table.new([])

headers = [
  'id',
  'title',
  ...
  'price'
]

# メンテナが代わることによる無理な列名の追加...
headers << 'tax price' if ....

books.each do |book|
  # ヘッダ部をみながらデータ部の並びを整えるのが大変...
  table << CSV::Row.new(headers, [book.id, book.title, ..., book.price])
end

puts table.to_csv

시도한 것



몇 년 전이지만 csv_box를 만들어 보았습니다. Rails 로 사용되는 것을 상정하고 있어 현재 컬럼의 내용을 그대로 출력합니다.
CSVBox.add 로 출력할 열을 정의합니다. 여기에서는 나란히 관계없이 무엇을 출력하고 싶은지입니다. 인수에는 모델명 등 대상을 알 수 있도록 하면 좋다고 생각합니다.
CSVBox.add 'book' do
  field 'id'
  field 'title'
  field 'price'
end
CSVBox.layoutsCSVBox.add 로 등록한 대상에 어느 순서로 출력하고 싶은지를 결정할 수 있습니다. 레이아웃에 layout 로 이름을 붙일 수 있어 CSV 의 작성시에 사용합니다.
CSVBox.layouts 'book' do
  layout 'shuffled layout' do |box|
    box.price
    box.id
    box.title
  end

 layout 'simple layout' do |box|
    box.title
    box.price
  end
end
CSVBox.take 로 대상의 이름과 레이아웃명을 지정해, 무엇을 어떻게 출력하는지를 결정합니다. << 에서 CSV::Table 를 사용하여 행을 추가한 것처럼 추가할 수 있습니다.
box = CSVBox.take 'book', 'shuffled layout'

books.each do |book|
  box << book
end

puts box.to_csv

__END__
price,id,title
1500,1,How to cook delicious meals
250,2,10 tips to lose weight

레이아웃의 변경도 편하고 조건에 따라 바꾸면 다음과 같습니다.
box = if ...
        CSVBox.take 'book', 'shuffled layout'
      else
        CSVBox.take 'book', 'simple layout'
      end

books.each do |book|
  box << book
end

puts box.to_csv

CSV 출력과 나누어, 대상의 무엇을 출력하는지, 컬럼의 순서나 조건을 레이아웃 마다 바꾸어 하는 것으로써 상당히 깨끗이 한 것은 아닐까요? 향후입니다만, 예를 들어 세금 포함 가격을 표시하고 싶은 등 그 때만의 계산도 있다고 생각합니다 데코레이터로 도망쳐도 좋다고 생각합니다만, 계산도 짜넣을 수 있게 되는 것이 향후의 전망입니다.

좋은 웹페이지 즐겨찾기