4

私はrubyの標準csvlibを使用して、オブジェクトのarrを「a.csv」と呼ばれるcsv.fileにダンプしようとします。

http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html#method-c-dump

dump(ary_of_objs, io = "", options = Hash.new)

しかし、この方法では、どうすればファイルにダンプできますか?そのような例は存在せず、助けになります。私はそれをグーグルで検索する例はありません...

また、ドキュメントはそれを言った...

次に提供できるメソッドは、csv_headers()と呼ばれるインスタンスメソッドです。このメソッドは、ドキュメントの2行目を(これも配列として)返すことが期待されています。これは、各列にヘッダーを付けるために使用されます。デフォルトでは、フィールドヘッダーが@文字で始まる場合、またはヘッダーをメソッド名として、フィールド値を引数として渡すsend()を呼び出す場合、::loadはインスタンス変数を設定します。このメソッドは、配列の最初のオブジェクトでのみ呼び出されます。

インスタンスメソッドcsv_headers()をこのダンプ関数に渡す方法を知っている人はいますか?

4

2 に答える 2

3

これはまだテストしていませんが、ioをファイルに設定する必要があるようです。リンクしたドキュメントによると、「ioパラメータを使用してファイルにシリアル化できます」

何かのようなもの:
f = File.open("filename")
dump(ary_of_objs, io = f, options = Hash.new)

于 2012-06-01T05:16:03.827 に答える
2

受け入れられた答えは実際には質問に答えていないので、私は有用な例を挙げたいと思いました。

まず、http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.htmlのドキュメントを見ると、メソッド名にカーソルを合わせると表示されdumpますclick to show source。これを行うと、メソッドが、渡した最初のオブジェクトdumpを呼び出そうとしていることがわかります。csv_headersary_of_objs

obj_template = ary_of_objs.first

...snip...

headers = obj_template.csv_headers

その後、メソッドがcsv_dumpで各オブジェクトを呼び出し、 :ary_of_objsを渡すことがわかります。headers

ary_of_objs.each do |obj|
    begin
      csv << obj.csv_dump(headers)
    rescue NoMethodError
      csv << headers.map do |var|
        if var[0] == @
          obj.instance_variable_get(var)
        else
          obj[var[0..-2]]
        end
      end
    end
  end

array_of_objsしたがって、これら2つの方法に対応するには、の各エントリを拡張する必要があります。Hashを取り、ハッシュキーをCSVヘッダーとして返し、ヘッダーに基づいて各行をダンプできるラッパークラスの例を次に示します。

class CsvRowDump               
  def initialize(row_hash)     
    @row = row_hash            
  end                                                  

  def csv_headers              
    @row.keys                  
  end                          

  def csv_dump(headers)        
    headers.map { |h| @row[h] }
  end                          
end                       

ただし、もう1つ問題があります。このdumpメソッドは、CSVファイルの先頭のヘッダーの前に余分な行を書き込みたいので、このコードが先頭にあるためにこのメソッドを呼び出す場合、それをスキップする方法はありません。

  # write meta information
  begin
    csv << obj_template.class.csv_meta
  rescue NoMethodError
    csv << [:class, obj_template.class]
  end     

そこから''を返してもCsvRowDump.csv_meta、解析でヘッダーが必要な空白行になります。代わりにdump、その行を書いて、後で。を呼び出すときにそれを削除しましょうdump。この例では、すべて同じキー(CSVヘッダーになります)を持つハッシュの配列があることを前提としています。

@rows = @hashes.map { |h| CsvRowDump.new(h) }
File.open(@filename, "wb") do |f|
  str = CSV::dump(@rows)
  f.write(str.split(/\n/)[1..-1].join("\n"))
end
于 2013-06-04T15:57:48.497 に答える