2

csv ファイルをアップロードして解析し、S​​3 用のファイルを吐き出すか、表示するだけにしようとしています。file_field_tag を使用して csv をアップロードします。file_field_tag は IO のサブクラスであるオブジェクトを渡し、"each_line" などのすべての ruby​​ IO メソッドを持っていると思いました。オブジェクト (IO クラスのメソッド) で "read" を呼び出すことはできますが、"each_line" を呼び出すことはできません。

コントローラーのメソッドを次のように作成します。

@csv_file = params[:csv_file]

「each_line」メソッドエラーをスローしない私のショービュー:

<% @csv_file.each_line do |line| %>
<%= line %>
<% end %>

でも使える

<%= @csv_file.read(100) %>

file_field_tag upload params[] が持っているメソッドが本当に混乱しています... each_line、gets が機能しません... 使用できるもののリストが見つからないようです。

編集 私はこれを回避しました:

@csv_file = params[:csv_file].read.to_s

次に、次のように繰り返します。

<% @sp_file.each_line do |line| %>
<%= line %>
<% end %>

EDIT 2 アップロードされているファイルには、コンマを含まない行の後にヘッダーが繰り返されています(尋ねないでください)...したがって、コンマのない行を見つけて.getsを呼び出します(レールに依存しないrbスクリプトで)。残念ながら、gets が呼び出せないプライベート メソッドであるというエラーが表示されます。これは私の最初の問題に戻ります。ファイルは read_lines や gets のような IO メソッドを持つ IO のサブクラスではありませんか?

        @file_out = []
        @file_in.each_line do |line|
            case line
            when /^[^,]+$/
                @comp = line.to_s.strip
                comp_header = @file_in.gets.strip.split('')

                @file_out.push(@comp)
            end
        end
4

1 に答える 1

2

'file_field'を投稿すると、コントローラーに返されるパラメーターに特別な魔法がフックされます。

つまり、あなたの場合、あなたはこれをすることができます

<%= "The following file was uploaded #{params[:csv_file].original_filename}" %>
<%= "It's content type was #{params[:csv_file].content_type}" %>
<%= "The content of the file is as follows: #{params[:csv_file].read}" %>

つまり、これらはparams [:csv_file]で呼び出すことができる3つの特別なメソッド、またはビューで「file_field_tag」または「f.file_field」が成功した結果として投稿されたパラメータです。

これらは、file_fieldの結果として投稿されたパラメーターに対して実行できる3つの特別なことであることを覚えておいてください。

original_filename

content_type

読む

読み取り方法を明確に理解しているので、original_filenameとcontent_typeが将来役立つ可能性があります。

編集

さて、あなたが持っているのは、アップロードされたファイルの内容を読み取るreadメソッドだけです。

contents = params[:csv_file].read

したがって、contentsはファイルの内容を含む文字列になりますが、csvファイルであることを除いて、そのファイルについては他に何もわかりません。csvが「\r」で区切られていることはわかっています(csvの解析で多くの作業を行ったと思いますが、チェックするのが面倒です)

だからあなたはこれを行うことができます:

contents = params[:csv_file].read
contents.split("\r").each do |csvline|
  ???
end

編集2

だからここにこの投稿からの持ち帰りがあります

file_fieldをコントローラーに投稿する場合、アップロードされたファイルの内容を処理する最も一般的なことは、ファイルをルビー文字列に「読み込む」ことです。アップロードされたコンテンツの追加処理は、「読み取り」から返されたそのルビー文字列に対して実行する必要があります。

この特定のケースでは、アップロードされたファイルが常にCSVである場合、CSVを想定し、それに応じて解析を開始できます。複数のアップロード形式が予想される場合は、次のように対処する必要があります。

contents = params[:csv_file].read
case params[:csv_file].content_type
when 'txt/csv'
  contents.split("\r").each do |csvline| 
    ???
  end
when 'application/pdf'
  ???
end
于 2013-01-06T02:38:39.123 に答える