У меня есть форма (Rails), которая позволяет мне загрузить CSV-файл, используя 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 %>
Щелчок Submit перенаправляет меня на другую страницу (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
Обе file.length
и file.size
возвращает '91', когда мой файл содержит только 7 строк. Из документации Rails, которую я прочитал, после нажатия кнопки «Отправить» Rails создает временный файл загруженного файла, а params[:upcsv][:filename]
содержит содержимое файла temp/uploaded, а не путь к файлу. И я не знаю, как извлечь количество строк в моем исходном файле. Каков правильный способ получить количество строк в файле?
Мой create.html.erb:
<table>
<tr>
<td>File length:</td>
<td><%= params[:upcsv][:file_length] %></td>
</tr>
</table>
Я действительно новичок в Rails (только начал на прошлой неделе), поэтому, пожалуйста, медведь со своими глупыми вопросами.
Спасибо!
Обновление: Очевидно, что число '91' - это количество отдельных символов (включая возврат каретки) в моем файле. Каждая строка в моем файле имеет 12 цифр + 1 новая строка = 13. 91/13 = 7.
Будьте осторожны реальным позволяя файл будет загружен без каких-либо тестов на размер_файле. Представьте себе проблемы, если файл использует все дисковое пространство на вашем диске. Или, если в файле много гигабайт возврата каретки, и ваш код в Rails вращается, пытаясь прочитать и подсчитать строки, DOSing вашего хоста. Если вы находитесь в Linux, вы можете захотеть, чтобы команда 'wc' OS выполняла для вас подъем, так как она могла быстро возвращать количество строк и количество символов в файле, без необходимости открывать и читать Rails. –