Подсчитать длину (количество строк) файла CSV? - PullRequest
19 голосов
/ 11 января 2011

У меня есть форма (Rails), которая позволяет мне загружать файл .csv, используя file_field. По мнению:

    <% 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 %>

Нажатие кнопки «Отправить» перенаправляет меня на другую страницу (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] содержит содержимое временного / загруженного файла, а не путь к файл. И я не знаю, как извлечь количество строк в моем исходном файле. Как правильно получить количество строк в файле?

Мой 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.

Ответы [ 7 ]

21 голосов
/ 21 февраля 2014

Все решения, перечисленные здесь, фактически загружают весь файл в память для получения количества строк. Если вы работаете в системе на основе Unix, гораздо более быстрое, простое и эффективное использование памяти:

`wc -l #{your_file_path}`.to_i
16 голосов
/ 11 января 2011

.length и .size на самом деле являются синонимами. чтобы получить количество строк в файле csv, вам нужно его проанализировать. простой подсчет новых строк в файле не сработает, потому что в строковых полях в csv действительно могут быть разрывы строк. простой способ получить linecount был бы:

CSV.read(params[:upcsv][:filename]).length
14 голосов
/ 12 января 2011

Другой способ прочитать количество строк -

file.readlines.size
5 голосов
/ 05 ноября 2015
CSV.foreach(file_path, headers: true).count

Выше будет исключать заголовок при подсчете строк

CSV.read(file_path).count
1 голос
/ 10 августа 2015

your_csv.count должен сделать трюк.

0 голосов
/ 22 января 2015

Если ваш CSV-файл не помещается в память (не может использовать readlines), вы можете сделать:

def self.line_count(f)
  i = 0
  CSV.foreach(f) {|_| i += 1}
  i
end

В отличие от wc -l здесь учитывается фактическое количество записей, а не количество строк. Они могут отличаться, если в значениях полей появляются новые строки.

0 голосов
/ 10 августа 2012

Просто чтобы продемонстрировать, что делает IO # readlines:

, если у вас был такой файл: "asdflkjasdlkfjsdakf \ n asdfjljdaslkdfjlsadjfasdflkj \ n asldfjksdjfa \ n"

в рельсах, которые вы делаете,скажем:

file = File.open(File.join(Rails.root, 'lib', 'file.json'))
lines_ary = IO.readlines(file)
lines_ary.count #=> 3

IO # readlines преобразует файл в массив строк, используя \ n (новые строки) в качестве разделителей, так же, как это часто делают запятые, так что это в основном похоже на

str.split(/\n/)

На самом деле, если бы вы сделали

 x = file.read

, это

 x.split(/\n/)

сделало бы то же самое, что и file.readlines

** IO # readlines может быть действительноудобно при работе с файлами с повторяющейся структурой строк («child_id», «parent_ary», «child_id», «parent_ary», ...) и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...