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