计算CSV文件的长度(行数)?

Mat*_*ias 20 ruby csv ruby-on-rails

我有一个表单(Rails),允许我使用file_field.加载.csv文件.在视图中:

    <% form_for(:upcsv, :html => {:multipart => true}) do |f| %>
    <table>
        <tr>
            <td><%= f.label("File:") %></td>
            <td><%= f.file_field(:filename) %></td>
        </tr>
    </table>
        <%= f.submit("Submit") %>
    <% end %>
Run Code Online (Sandbox Code Playgroud)

单击"提交"会将我重定向到另一个页面(create.html.erb).文件加载正常,我能够在第二页中正确阅读内容.我试图在第二页中显示.csv文件中的行数.

我的控制器(半伪代码):

class UpcsvController < ApplicationController
    def index
    end

    def create
        file = params[:upcsv][:filename]
        ...
        #params[:upcsv][:file_length] = file.length # Show number of lines in the file
        #params[:upcsv][:file_length] = file.size
        ...
    end
end
Run Code Online (Sandbox Code Playgroud)

双方file.lengthfile.size返回"91"时,我的文件只包含7条线.在我阅读的Rails文档中,单击"提交"按钮后,Rails会创建上载文件的临时文件,其中params[:upcsv][:filename]包含临时/上载文件的内容,而不包含文件的路径.而且我不知道如何提取原始文件中的行数.获取文件中行数的正确方法是什么?

我的create.html.erb:

<table>
    <tr>
        <td>File length:</td>
        <td><%= params[:upcsv][:file_length] %></td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

我是Rails的新手(刚开始上周),所以请忍受我的愚蠢问题.

谢谢!

更新:显然,数字'91'是我文件中单个字符的数量(包括回车).我文件中的每一行都有12位+ 1换行= 13. 91/13 = 7.

Jac*_*ius 22

此处列出的所有解决方案实际上将整个文件加载到内存中以获取行数.如果您使用的是基于Unix的系统,则更快,更简单且更节省内存的解决方案是:

`wc -l #{your_file_path}`.to_i
Run Code Online (Sandbox Code Playgroud)

  • CSV中的一行可以包含换行符,您实际上需要对其进行解析。 (2认同)

rom*_*man 17

.length和.size实际上是同义词.要获取csv文件的rowcount,你必须实际解析它.简单地计算文件中的换行符是行不通的,因为csv中的字符串字段实际上可以有换行符.获得行数的简单方法是:

CSV.read(params[:upcsv][:filename]).length
Run Code Online (Sandbox Code Playgroud)


gic*_*ppa 15

另一种读取行数的方法是

file.readlines.size
Run Code Online (Sandbox Code Playgroud)

  • CSV 中的一行可以包含换行符,您需要实际解析它。 (2认同)

Tai*_*aiz 5

CSV.foreach(file_path, headers: true).count
Run Code Online (Sandbox Code Playgroud)

上面会在计算行时排除标题

CSV.read(file_path).count
Run Code Online (Sandbox Code Playgroud)