Ruby查看csv数据

bra*_*r19 2 ruby csv arrays ruby-on-rails

我从csv文件中获取了一些数据(如何在csv中选择前20个?),例如:

A B C
D E F
Run Code Online (Sandbox Code Playgroud)

还方法:

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
Run Code Online (Sandbox Code Playgroud)

所以它是数组的数组......但是我如何在haml视图中正常查看它?我如何查看数组数组?我尝试了类似的东西(在每个文件中我都有不同的列数):view:

= @csv.first.each do |a|
 = a[:1]
Run Code Online (Sandbox Code Playgroud)

请帮我看一下csv数据.

the*_*Man 5

有几种方法可以读取一定数量的记录,您需要根据数据源的预期大小选择要使用的记录.

从CSV文件开始:

A1,A2,A3
B1,B2,B3
C1,C2,C3
D1,D2,D3
E1,E2,E3
F1,F2,F3
Run Code Online (Sandbox Code Playgroud)

读取固定数量记录的最简单方法是以下方法之一:

require 'csv'

array = CSV.read('test.csv')[0, 2]
Run Code Online (Sandbox Code Playgroud)

返回两个子数组的数组:

[
    [0] [
        [0] "A1",
        [1] "A2",
        [2] "A3"
    ],
    [1] [
        [0] "B1",
        [1] "B2",
        [2] "B3"
    ]
]
Run Code Online (Sandbox Code Playgroud)

另一种选择是:

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

返回相同的结果,两个子数组的数组:

[
    [0] [
        [0] "A1",
        [1] "A2",
        [2] "A3"
    ],
    [1] [
        [0] "B1",
        [1] "B2",
        [2] "B3"
    ]
]
Run Code Online (Sandbox Code Playgroud)

这两个对于小输入文件都很好,但是如果从大输入文件中读取几行,则会出现问题.它们将强制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  
Run Code Online (Sandbox Code Playgroud)

替换5为要跳过的记录数,以及2要读取的数字.对于该示例,我故意读取文件的末尾以显示如何跳过行,读取一些然后干净地处理EOF情况.

数据看起来像:

[
    [0] [
        [0] "F1",
        [1] "F2",
        [2] "F3"
    ]
]
Run Code Online (Sandbox Code Playgroud)

因为我正在使用File.open块,所以在块存在后文件会自动关闭,从而避免在文件句柄周围留下打开文件句柄.

您的问题的HAML输出部分根本没有明确定义,但这是输出数据的一种方法:

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)
Run Code Online (Sandbox Code Playgroud)

这导致一个简单的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>
Run Code Online (Sandbox Code Playgroud)

编辑:

和我的测试文件: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
Run Code Online (Sandbox Code Playgroud)

而这段代码:

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)
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

<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>
Run Code Online (Sandbox Code Playgroud)

我做了一个小改动,移动arrayFile.open街区之外,没有别的不同.