3

FasterCSV の :header_converters と :converters を理解できません。基本的に、列ヘッダーを適切な列名に変更するだけです。

何かのようなもの:

FasterCSV.foreach(csv_file, {:headers => true, :return_headers => false, :header_converters => :symbol, :converters => :all} ) do |row|
    puts row[:some_column_header] # Would be "Some Column Header" in the csv file.

execpt コンバーターのパラメーターに :symbol と :all が含まれていません。

4

3 に答える 3

9

:allコンバーターは、すべての組み込みコンバーターを試すことを意味します。具体的には、次のとおりです。

:integer:   Converts any field Integer() accepts.
:float:     Converts any field Float() accepts.
:date:      Converts any field Date::parse() accepts.
:date_time: Converts any field DateTime::parse() accepts.

基本的に、これはフィールドを文字列として残すのではなく、(可能であれば) それらの値に変換しようとすることを意味します。そのrow[i]ため、文字列値 '9' を返す場合、代わりに整数値 9 を返します。

ヘッダー コンバーターは、ヘッダーを使用して行にインデックスを付ける方法を変更します。たとえば、次のようなことをするとします。

FastCSV.foreach(some_file, :header_converters => :downcase) do |row|

ヘッダー「Some Header」を持つ列を として索引付けしますrow['some header']

代わりに使用する場合:symbolは、 で索引付けしrow[:some_header]ます。Symbol は、ヘッダー名を小文字化し、スペースをアンダースコアに置き換え、az、0-9、. 以外の文字を削除し_ます。シンボルの比較は文字列の比較よりもはるかに高速であるため、便利です。

で列にインデックスを付けたい場合は、オプションrow['Some Header']を提供しないでください。:header_converter


編集:

あなたのコメントに応えて、 headers_convert はあなたが望むことをしません。ヘッダー行の値は変更されず、インデックスとして使用される方法だけが変更されます。代わりに、:return_headersオプションを使用してヘッダー行を検出し、変更を加える必要があります。ファイルを変更して再度書き出すには、次のようなものを使用できます。

require 'fastercsv'

input = File.open 'original.csv', 'r'
output = File.open 'modified.csv', 'w'
FasterCSV.filter input, output, :headers => true, :write_headers => true, :return_headers => true do |row|
  change_headers(row) if row.header_row?
end
input.close
output.close

元のファイルを完全に置き換える必要がある場合は、上記の実行後に次の行を追加します。

FileUtils.mv 'modified.csv', 'original.csv', :force => true
于 2009-06-02T17:41:36.037 に答える
1

この問題を解決する簡単な方法を見つけました。FasterCSV ライブラリは問題なく動作します。投稿が作成されてから現在までの〜7年が関係していると確信していますが、ここで注目に値すると思いました.

私の意見では、CSV ファイルを読み取る場合、FasterCSV:header_convertersオプションは十分に文書化されていません。ただし、シンボル ( header_converters: :symbol) を割り当てる代わりに、ラムダ ( header_converters: lambda {...}) を割り当てることができます。CSV ライブラリがファイルを読み取るとき、ラムダを使用してヘッダーを変換します。次に、変換されたヘッダーを反映する新しい CSV ファイルを保存できます。

例えば:

options = {
  headers: true,
  header_converters: lambda { |h| HEADER_MAP.keys.include?(h.to_sym) ? HEADER_MAP[h.to_sym] : h }
}

table = CSV.read(FILE_TO_PROCESS, options)

File.open(PROCESSED_FILE, "w") do |file|
  file.write(table.to_csv)
end
于 2016-07-16T15:54:39.407 に答える
0

CSV ファイル ヘッダーの書き換えは、エクスポートされた CSV ファイルをインポートに変換するすべてのユーザーにとって一般的な要件です。

次のアプローチで必要なものが得られることがわかりました。

lookup_headers = { "old": "new", "cat": "dog" } # The desired header swaps

CSV($>, headers: true, write_headers: true) do |csv_out|
  CSV.foreach( ARGV[0],
               headers: true, 
               # the following lambda replaces the header if it is found, leaving it if not...
               header_converters: lambda{ |h| lookup_headers[h] || h}, 
               return_headers: true) do |master_row|

    if master_row.header_row?
      # The headers are now correctly replaced by calling the updated headers
      csv_out << master_row.headers
    else
      csv_out << master_row
    end
  end
end

お役に立てれば!

于 2017-11-17T18:54:05.097 に答える