manipulacion guardar eliminar archivos archivo ruby-on-rails ruby csv

ruby-on-rails - eliminar - guardar archivo en ruby



¿Cuenta la longitud(número de líneas) de un archivo CSV? (7)

.length y .size son en realidad sinónimos. para obtener el recuento de filas del archivo csv, debe analizarlo. el simple hecho de contar las nuevas líneas en el archivo no funcionará, porque los campos de cadena en un csv realmente pueden tener saltos de línea. Una forma simple de obtener el linecount sería:

CSV.read(params[:upcsv][:filename]).length

Tengo un formulario (Rails) que me permite cargar un archivo .csv usando file_field . En la vista:

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

Al hacer clic en Enviar me redirige a otra página (create.html.erb). El archivo se cargó bien y pude leer el contenido correctamente en esta segunda página. Estoy tratando de mostrar el número de líneas en el archivo .csv en esta segunda página.

Mi controlador (semi-pseudocódigo):

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

Tanto file.length como file.size devuelven ''91'' cuando mi archivo solo contiene 7 líneas. De la documentación de Rails que leí, una vez que se hace clic en el botón Enviar, Rails crea un archivo temporal del archivo cargado, y los params[:upcsv][:filename] contienen el contenido del archivo cargado / temporal y no la ruta a el archivo. Y no sé cómo extraer el número de líneas en mi archivo original. ¿Cuál es la forma correcta de obtener el número de líneas en el archivo?

Mi create.html.erb:

<table> <tr> <td>File length:</td> <td><%= params[:upcsv][:file_length] %></td> </tr> </table>

Soy realmente nuevo en Rails (recién empecé la semana pasada), así que por favor agárrate con mis preguntas estúpidas.

¡Gracias!

Actualización: al parecer, ese número ''91'' es el número de caracteres individuales (incluido el retorno de carro) en mi archivo. Cada línea en mi archivo tiene 12 dígitos + 1 nueva línea = 13. 91/13 = 7.


Otra forma de leer el número de líneas es

file.readlines.size


Si su archivo csv no se ajusta a la memoria (no puede usar líneas de lectura), puede hacerlo:

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

A diferencia de wc -l esto cuenta el número de registros reales, no el número de líneas. Estos pueden ser diferentes si hay nuevas líneas en los valores de campo.


Solo para demostrar lo que hace IO # readlines:

si tenía un archivo como este: "asdflkjasdlkfjsdakf / n asdfjljdaslkdfjlsadjfasdflkj / n asldfjksdjfa / n"

en rieles lo harías, decir:

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

Las líneas de lectura de IO # convierten un archivo en una matriz de cadenas utilizando los / n (nuevas líneas) como separadores, al igual que las comas, así que básicamente es como

str.split(//n/)

De hecho, si lo hiciste

x = file.read

esta

x.split(//n/)

haría lo mismo que file.readlines

** Las líneas de lectura de IO # pueden ser realmente útiles cuando se trata de archivos que tienen una estructura de línea repetitiva ("id_de_datos", "parent_ary", "child_id", "parent_ary", ...) etc.


Todas las soluciones enumeradas aquí realmente cargan el archivo completo en la memoria para obtener el número de líneas. Si está en un sistema basado en Unix, una solución mucho más rápida, fácil y eficiente en memoria es:

`wc -l #{your_file_path}`.to_i


your_csv.count debería hacer el truco.


CSV.foreach(file_path, headers: true).count

Lo anterior excluirá el encabezado mientras se cuentan las filas.

CSV.read(file_path).count