2

私は csv ファイルからいくつかのデータを取得しています (また、csv で最初の 20 を選択する方法は?)、たとえば:

A B C
D E F

また方法:

def common_uploader
    require 'csv'
    arr = CSV.read("/#{Rails.public_path}/uploads_prices/"+params[:file], {:encoding => "CP1251:UTF-8", :col_sep => ";", :row_sep => :auto, :headers => :none})  
    @csv = []
    @csv << arr
  end

それは配列の配列です...しかし、どうすればhamlビューで正常に表示できますか? 配列の配列を表示するにはどうすればよいですか? 私は次のようなことを試しました(また、各ファイルで列の数が異なります): ビュー:

= @csv.first.each do |a|
 = a[:1]

csvデータを表示するのを手伝ってください。

4

3 に答える 3

5

設定された数のレコードを読み取る方法はいくつかあり、データソースの予想されるサイズに基づいて使用するレコードを選択する必要があります。

CSVファイルから開始します。

A1,A2,A3
B1,B2,B3
C1,C2,C3
D1,D2,D3
E1,E2,E3
F1,F2,F3

固定数のレコードを読み取る最も簡単な方法は、次のいずれかです。

require 'csv'

array = CSV.read('test.csv')[0, 2]

これは、2つのサブ配列の配列を返します。

[
    [0] [
        [0] "A1",
        [1] "A2",
        [2] "A3"
    ],
    [1] [
        [0] "B1",
        [1] "B2",
        [2] "B3"
    ]
]

別の方法は次のとおりです。

File.new('test.csv').readlines[0, 2].map{ |l| CSV.parse(l).flatten }

これは同じ結果、2つのサブ配列の配列を返します。

[
    [0] [
        [0] "A1",
        [1] "A2",
        [2] "A3"
    ],
    [1] [
        [0] "B1",
        [1] "B2",
        [2] "B3"
    ]
]

これらは両方とも小さな入力ファイルには問題ありませんが、大きな入力ファイルから数行を読み取る場合は問題が発生します。これらは、Rubyにファイル全体をメモリに読み込み、必要な数のレコードをスライスする前に中間配列を作成するように強制します。私が働いている場所では、ギガバイトのファイルサイズを取得することはできません。そのため、これらのファイルの小さなセクションを取得すると、Rubyが作成され、システムは中間配列を構築して破棄するという膨大な量の作業を行います。

必要な最小限の数のレコードのみを読み取る方がよいでしょう。読む前に行をスキップする必要がある場合があります。EOFErrorこれは、入力ファイルのEOFが予期せず発生した場合の処理​​とともに、そのアイデアを示しています。

File.open('test.csv') do |fi|
  array = []
  begin  
    5.times { fi.readline }    
    2.times.each{ array += CSV.parse(fi.readline) }    
  rescue EOFError    
  end    
end  

5スキップするレコード2の数と読み取る数に置き換えます。その例では、ファイルの終わりを意図的に読み上げて、行をスキップし、いくつかを読み、EOF状況をきれいに処理する方法を示しています。

データは次のようになります。

[
    [0] [
        [0] "F1",
        [1] "F2",
        [2] "F3"
    ]
]

私はFile.openブロックで使用しているので、ブロックが存在するとファイルは自動的に閉じられ、開いているファイルハンドルがぶら下がるのを防ぎます。

質問のHAML出力セクションはまったく定義されていませんが、これはデータを出力する1つの方法です。

array = []
File.open('test.csv') do |fi|
  begin  
    0.times { fi.readline }    
    2.times.each{ array += CSV.parse(fi.readline) }    
  rescue EOFError    
  end    
end  

require 'haml'

engine = Haml::Engine.new(<<EOT)
%html
  %body
    %table
      - array.each do |r|
        %tr
          - r.each do |c|
            %td= c
EOT
puts engine.render(Object.new, :array => array)

これにより、単純なHTMLテーブルが次のように出力されます。

<html>
  <body>
    <table>
      <tr>
        <td>A1</td>
        <td>A2</td>
        <td>A3</td>
      </tr>
      <tr>
        <td>B1</td>
        <td>B2</td>
        <td>B3</td>
      </tr>
    </table>
  </body>
</html>

編集:

と私のテストファイル:dl.dropbox.com/u/59666091/qnt_small.csvブラウザでこの7列を表示したい(hamlビュー経由)

これをテストデータとして使用します。

a1,a2,a3,a4,a5,a6,a7
b1,b2,b3,b4,b5,b6,b7
c1,c2,c3,c4,c5,c6,c7
d1,d2,d3,d4,d5,d6,d7
e1,e2,e3,e4,e5,e6,e7

そしてこのコード:

require 'csv'

array = []
File.open('test.csv') do |fi|
  begin
    0.times { fi.readline }
    2.times.each{ array += CSV.parse(fi.readline) }
  rescue EOFError
  end
end

require 'haml'

engine = Haml::Engine.new(<<EOT)
%html
  %body
    %table
      - array.each do |r|
        %tr
          - r.each do |c|
            %td= c
EOT
puts engine.render(Object.new, :array => array)

私はこの出力を取得します:

<html>
  <body>
    <table>
      <tr>
        <td>a1</td>
        <td>a2</td>
        <td>a3</td>
        <td>a4</td>
        <td>a5</td>
        <td>a6</td>
        <td>a7</td>
      </tr>
      <tr>
        <td>b1</td>
        <td>b2</td>
        <td>b3</td>
        <td>b4</td>
        <td>b5</td>
        <td>b6</td>
        <td>b7</td>
      </tr>
    </table>
  </body>
</html>

ブロックarrayの外に移動するために小さな変更を加えましたが、他に違いはありません。File.open

于 2013-01-02T04:14:05.690 に答える
0

あなたはそのように行うことができます:

arr = CSV.read("/data.csv", {:encoding => "CP1251:UTF-8", :col_sep => ",", :row_sep => :auto, :headers => :none})

i = 0
arr.each do |row|
  if i == 20
    break
  else
    i += 1
  end

  # do  sth
  puts row
end

しかし、それは美しい解決策ではないと思います。編集:CSVのインスタンスを配列に入れる理由がわかりません.csvファイルの各行を配列に入れません

于 2013-01-01T21:07:48.790 に答える
-1
require 'csv'
def parser
  CSV.open('data.csv', 'r', ';') do |row|
  puts row
end
于 2013-01-01T22:36:32.460 に答える