2011-09-29 5 views
0

나는 그들이 주문한 고객과 제품이있는 CSV 파일을 구문 분석해야합니다. 고객은 다른 제품에 대해 반복 할 수 있습니다. 나는 주문한 모든 고유 고객과 제품을 확보해야합니다. 그런 다음 각 고객과 제품을 인쇄하십시오. 나는 객체 지향적 인 방식으로 그렇게 할 것을 요청 받았다. 1) 내가 고객 객체를 만들고 거기에 속성을 가지고 있어야한다. 2) foreach와 loop를 사용하여 프로그램을 작성하고 고객과 제품을 해시로 저장하고 인쇄한다. 그것.지향 지향 및 구문 분석 csv

내가 무엇을 던 졌는지는 객체 지향적 인 방식으로 수행하도록 요청 받았습니다. 만약 객체를 생성하면 메모리에 커스텀 객체를 저장할 수 있습니까? 그래서 내가 고객을 두 번째로 만나는 경우 제품을 추가해야하고 결국에는 모든 객체를 반복하여 인쇄해야합니다. 죄송합니다. 저는 긴 질문을 읽고 도움을 청하는 데 영어로 감사드립니다.

+0

아마도 어떻게 할 것인지 게시하고 개선 제안을 요청해야합니다. – Miguel

답변

1

어떻게 메모리에 사용자 지정 개체를 저장할 수 있습니까? 객체를 생성하고이를 목록, 해시 또는 기타 적절한 것으로 유지합니다. (키가 CSV에있는 고유 한 값인 해시 일 가능성이 높습니다. 값은 제품 모음입니다.)

"객체 지향적 인 방식으로"요청하는 것은 조금 임의적입니다 그래도.

0

FasterCSV 또는 Ruby 1.9를 사용하는 경우 파서를 확장하여 각 CSV 행을 사용자 정의 객체에 매핑 할 수 있습니다.

# http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-c-load 
# http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-c-dump 
# https://github.com/JEG2/faster_csv/blob/master/test/tc_serialization.rb 
require 'csv' 

class Person 
    attr_accessor :id, :name, :email 

    def self.csv_load(meta, headers, row) 
    person = Person.new 
    headers.each.with_index { |h,i| 
     person.send "#{h}=", row[i] 
    } 
    person 
    end 

    def self.parse(csv) 
    meta = "class,#{self.to_s}\n" 
    CSV.load("#{meta}#{csv}") 
    end 

    def dump 
    self.class.dump([self]) 
    end 

    def self.dump(people, io='', options={}) 
    CSV.dump(people, io, options).strip 
    end 

    def self.csv_meta 
    [] 
    end 

    def csv_headers 
    %w(id name email) 
    end 

    def csv_dump(headers) 
    headers.map { |h| self.instance_variable_get "@#{h}" } 
    end 

end 

CSV_DUMP = <<-CSV 
class,Person 
id=,name=,email= 
1,"First Dude",[email protected] 
2,"Second Dude",[email protected] 
3,"Third Dude",[email protected] 
CSV 

CSV_INPUT = <<-CSV 
id,name,email 
1,"First Dude",[email protected] 
2,"Second Dude",[email protected] 
3,"Third Dude",[email protected] 
CSV 

CSV_DUMP2 = <<-CSV 
class,Person 
#{CSV_INPUT} 
CSV 

people = Person.parse(CSV_INPUT) 
puts people.inspect 
dumped = Person.dump(people) 
puts dumped 
puts "----" 
puts Person.parse(dumped).inspect