Te sugerimos que revises esta resolución en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
Parece que su archivo CSV se generó a partir de una hoja de cálculo de Excel que tiene columnas agrupadas de esta manera:
... | Rushing | Passing | ...
... |Rushes|Gain|Loss|Net|TD|Att|Cmp|Int|Yards|TD|Conv| ...
(No estoy seguro si restauré los grupos correctamente).
No hay herramientas estándar para trabajar con este tipo de archivos CSV, AFAIK. Tienes que hacer el trabajo manualmente.
- Lea la primera línea, trátela como la primera línea de encabezado.
- Lea la segunda línea, trátela como segunda línea de encabezado.
- Lea la tercera línea, trátela como la primera línea de datos.
- …
Yo recomendaría usar el smarter_csv
gem, y proporcione manualmente los encabezados correctos:
require 'smarter_csv'
options = :user_provided_headers => ["Institution ID","Institution","Game Date","Uniform Number","Last Name","First Name", ... provide all headers here ... ],
:headers_in_file => false
data = SmarterCSV.process(filename, options)
data.pop # to ignore the first header line
data.pop # to ignore the second header line
# data now contains an array of hashes with your data
Consulte la página de GitHub para ver las opciones y los ejemplos. https://github.com/tilo/smarter_csv
Una opción que debes usar es :user_provided_headers
y luego simplemente especifique los encabezados que desea en un array. De esta manera, puede solucionar casos como este.
tendrás que hacer data.pop
para ignorar las líneas de encabezado en el archivo.
Tendrás que escribir tu propia lógica. CSV es realmente solo filas y columnas, y por sí mismo no tiene una idea inherente de lo que realmente es cada columna o fila, son solo datos sin procesar. Por lo tanto, CSV no tiene concepto ni conciencia de que tiene dos filas de encabezado, eso es algo humano, por lo que deberá crear su propia heurística.
Dado que sus filas de datos se ven así:
"721","Air Force","09/01/12",
Cuando comienza a analizar sus datos, si la primera columna representa un número entero, entonces, si lo convierte a un número entero y si es > 0
de lo que sabe que está tratando con una “fila” válida y no con un encabezado.