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.length并file.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)
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.foreach(file_path, headers: true).count
Run Code Online (Sandbox Code Playgroud)
上面会在计算行时排除标题
CSV.read(file_path).count
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22923 次 |
| 最近记录: |