Estrategia para editar archivos de valores separados por comas (CSV)


18

Cuando trabajo en proyectos de análisis de datos, a menudo almaceno datos en archivos de datos separados por comas o delimitados por tabulaciones (CSV, TSV). Mientras que los datos a menudo pertenecen a un sistema de gestión de bases de datos dedicado. Para muchas de mis aplicaciones, esto sería exagerar.

Puedo editar archivos CSV y TSV en Excel (o presumiblemente otro programa de hoja de cálculo). Esto tiene beneficios:

  • las hojas de cálculo facilitan la entrada de datos

También hay varios problemas:

  • Trabajar con archivos CSV y TSV genera una amplia gama de mensajes de advertencia sobre la pérdida de varias funciones y cómo solo se guardará la hoja activa, etc. Por lo tanto, es molesto si solo desea abrir el archivo y hacer un pequeño cambio.
  • Realiza muchas conversiones "supuestamente inteligentes". Por ejemplo, si ingresa 12/3, pensará que desea ingresar una fecha. ACTUALIZACIÓN: Debería haber mencionado que el ejemplo de fecha es solo uno de muchos ejemplos; La mayoría de los problemas parecen estar relacionados con la conversión inapropiada. En particular, los campos de texto que parecen números o fechas causan problemas.

Alternativamente, podría trabajar directamente con el archivo de texto en un editor de texto estándar. Esto asegura que lo que ingreso es lo que se registra. Sin embargo, es una forma muy incómoda de ingresar datos (las columnas no se alinean; es difícil ingresar datos simplemente en varias celdas, etc.).

Pregunta

  • ¿Cuál es una buena estrategia para trabajar con archivos de datos CSV o TSV? es decir, ¿qué estrategia hace que sea fácil ingresar y manipular los datos y al mismo tiempo garantizar que lo que ingrese se interprete correctamente?

1
¿Qué tipo de operaciones realizas en los archivos? En mi opinión, eso afecta dramáticamente el rango de opciones aceptables. Además, me parece que podría editar los datos de TSV en un procesador de texto y alinear las pestañas para preservar las columnas, siempre y cuando su procesador de texto se pueda configurar para que no haga conversiones "inteligentes" y pueda guardarlo como texto sin formato, que muchos pueden .
Wayne

@Wayne Buen punto. Debido a que he crecido con los programas de hoja de cálculo, hay muchos atajos con los que estoy familiarizado (funciones, copiar y pegar, agregar una columna adicional y mucho más). Tenga en cuenta que no estoy hablando aquí sobre el análisis de datos, sino simplemente creando un archivo de datos tabular simple (por ejemplo, alguna información meta necesaria para procesar mi código R). Si bien podría hacer todas estas manipulaciones básicas de tablas en R, no es tan intuitivo para mí. Probablemente con el tiempo, abrir un csv en R, hacer algunos pequeños cambios y guardarlo nuevamente se convertirá en mi opción preferida.
Jeromy Anglim

Respuestas:


14
  1. Si se siente cómodo con R, puede crear su data.frame básico y luego usar la función fix () para ingresar datos. En la misma línea que el n. ° 5, una vez que configure data.frame, puede usar una serie de readLines (n = 1) (o lo que sea) para ingresar sus datos, validarlos y brindar la oportunidad de agregar el siguiente fila. Luego deje la fijación para arreglar (). Vea un ejemplo implementado a continuación usando scan ().

  2. Otra opción en Excel sería desordenada, pero podría escribir 12/9, luego hacer que otra columna evalúe = IFERROR (MES (DateEntryCell) / DAY (DataEntryCell), DataEntryCell). Pero luego tendrá que mantener la hoja de Excel Y la hoja csv y toda la queja mientras escribe el csv persistirá.

  3. Alternativamente, siempre que sus campos sean relativamente cortos y tengan una longitud constante, un editor de texto normal debería servirle bien con TSV. Siempre puede cargarlo en Excel cuando haya terminado y asegurarse de que el número de columnas para cada fila sea lo que espera que sea.
  4. Emacs está disponible en varias plataformas y probablemente tiene algo para esto, por ejemplo, http://www.emacswiki.org/emacs/CsvMode .
  5. Si eres un alma calurosa, programar algo rápido en un lenguaje de programación para hacer la entrada de datos es trivial, la edición de datos será mucho más difícil.
  6. Una búsqueda rápida en Google muestra software con este solo propósito, pero ningún software libre parece ser bueno.
  7. Parece una locura, pero alguien en el superusuario sugirió editar tablas en el acceso y luego exportarlas como CSV ... eso es lo suficientemente loco como para funcionar.
  8. No impide que Excel se queje mientras guarda como .csv, pero puede escribir un solo apóstrofe antes del campo de entrada de datos y eso hace que lo deje solo en términos de formateo automático. Bueno, esto (al menos en Office 2007) no deja apóstrofes en el archivo csv.

Actualización: He estado hurgando mucho en este problema porque también es un problema que tengo. Hasta ahora, la solución mejor / más fácil para la entrada de datos que he visto hasta ahora es KillinkCSV . No es un software "gratuito", es shareware con una duración de prueba de 30 días y un precio razonable (~ $ 27). Sin embargo, no estoy seguro de cuánto confío en él para editar los CSV existentes: le di un CSV increíblemente grande (y presumiblemente bien formateado) y no pudo leer todas las filas. Sin embargo, parecía funcionar bien para uno que era razonablemente grande (20 MB) y el problema con el archivo más grande puede ser un error de mi parte.

R Ejemplo:

#This function takes a what argument like in scan, 
#a list with the types to be used, see usage example 
#at the end of this code block
#dataEntry will keep reading in values until 
#the values it reads in matches what is in 
#"terminateon".
#limitations: Many
dataEntry <- function(what,terminateon)
{
  CONTINUE <- TRUE #Make sure we start the loop
  data <- NULL #Create empty data so that the data.frame can define itself
  ti <- NULL
  while(CONTINUE)
  {
    ti <- NULL    
    ti <- tryCatch(
      {as.data.frame(scan(what=what, nlines=1, multi.line=FALSE, comment.char="",quiet=TRUE))},
      error=function (e) {print("Error in data entry! Line not stored.")
                          return(NULL)},
      warning=function(w) {print("Error in data entry! Line not stored.")
                           return(NULL)},
      finally={ti <- NULL}
    ) #Try getting the data according to the parameters in 'what' one row at a time.
    if (!is.null(ti))
    {
      if ((ncol(ti)==length(what)) & (nrow(ti)==1)) {
        data <- rbind(data,ti) #If there wasn't an error, add ti to the previous value  
      } else {
        print("Too many or not enough values on previous entry.")
        print("Tail of current data:")
        print(tail(data))
      }
    }
    if (!is.null(ti) & all(ti == terminateon)) 
    {
      CONTINUE <- FALSE
      data <- data[-c(nrow(data)),]
    } #if we've recieved the final value we won't continue and the last row is invalid so we remove it
  }
  return(data)
}

dataEntry(list(x=integer(), y=numeric(), z=character()),terminateon=c(999,999,"Z"))

Sí, y resulta que ya lo he csv-mode.elinstalado gracias al emacs-goodies-elpaquete en Debian / Ubuntu - ordenado.
Dirk Eddelbuettel

1
+1, para el punto 1, todo el software de estadísticas con el que he trabajado (además de R, Stata, SPSS y SAS) proporciona este tipo de funcionalidad. Por lo tanto, su consejo se generaliza a cualquier software con el que alguien quiera trabajar.
Andy W

5

Actualización: [Después de haber revisado una gran cantidad de correos electrónicos de R-Help], recuerdo el hilo sobre " El comportamiento deread.csv() ". En esto, Duncan Murdoch menciona que prefiere usar archivos de formato de intercambio de datos (DIF) en lugar de csv por alguna de las razones que menciona Jeromy. Acabo de intentar esto y Gnumeric se equivoca (cargando 12/3 como fecha), pero OpenOffice.org lee esto correctamente y conserva la información 12/3 intacta. (¿A alguien le importa comprobar esto en MS Excel?)

Los archivos DIF son texto sin formato y pueden leerse mediante hojas de cálculo y R (siempre que use una revisión R reciente (revisión SVN> = r53778)) leerá los datos en el formato correcto.


Original : siempre que sea posible, trataría de evitar el uso de una hoja de cálculo para la edición / manipulación de datos. Es increíblemente difícil, si no imposible, documentar cualquier cambio que realice en un conjunto de datos existente, de modo que prácticamente lo descarte desde un punto de vista de investigación reproducible. A lo sumo, uso una hoja de cálculo para ver rápidamente los datos existentes.

Para el procesamiento de datos, tiendo a escribir un script R que tomará el archivo csv sin procesar y aplicará todos los pasos de procesamiento necesarios. Comento mucho ese guión para explicar exactamente lo que estoy haciendo en cada etapa y por qué. Mi script de análisis de datos luego llamaría al script de procesamiento de datos que carga y procesa los datos.

Para la entrada de datos, ¿es más complicado ingresar los datos en un editor de texto o en una hoja de cálculo? Sospecho que los problemas que mencionas para este último no superan a los de tratar de ingresar datos CSV en un editor de texto.

Podrías probar una mejor hoja de cálculo; OpenOffice.org se niega a dejar de formatear 12/3 como una fecha (o lo convierte a la representación numérica) incluso si uno formatea la columna como "numérica" ​​primero. Gnumeric, por otro lado, dejará 12/3 como está si formatea la columna como "numérica" ​​primero.

Puede forzar a OpenOffice.org a que no formatee 12/3 como una fecha anteponiendo a 'a las entradas, es decir '12/3, se mostrará como 12/3 en la hoja de cálculo y se guardará como texto. Esto es probablemente bastante seguro de usar.

No estoy seguro de por qué querría 12/3 almacenado numéricamente como 12/3 en el archivo de texto: ¿cómo debería leer algo como R?

Su comentario sobre las advertencias sobre la pérdida de funciones o solo guardar la hoja activa no son realmente problemas, ¿verdad? (Si lo son, entonces quiero tus problemas en mi vida ;-)


Con respecto a la investigación reproducible, si el formato de archivo es CSV, entonces el archivo CSV podría ponerse fácilmente bajo control de versión con confirmaciones cuando se realizan cambios. ¿Sería esto suficiente para una investigación reproducible? Con respecto a la entrada de datos, a menudo hago o hago que otros hagan la entrada de datos sin formato en formato de ancho fijo para maximizar la eficiencia; sin embargo, prefiero almacenar datos en CSV o TSV (lo encuentro más transparente); con respecto al formateo de una columna como numérica. esta información probablemente se perdería al guardarla.
Jeromy Anglim

con respecto al 12/3, tuve un ejemplo de una prueba de opción múltiple en la que representaba el 12 dividido por 3. Sin embargo, lo uso más como un ejemplo ilustrativo. Cuando tengo un archivo CSV grande, no quiero ni siquiera una conversión inapropiada. Con respecto a las advertencias, si abro archivos CSV 10 veces al día, las advertencias se vuelven tediosas. También dejan menos claro si realmente he guardado el archivo CSV o no. Perdón por la diatriba.
Jeromy Anglim

@ Jeromy, sí, si fuera estricto al hacer un solo cambio (o un solo paso de procesamiento de datos) que guarde y confirme de inmediato. No quiero incluir una nota sobre el procesamiento en R (ya que es mi idioma preferido) usando un script. Así es como trabajo con los datos que me envían mis colegas; Podría echar un vistazo rápido en una hoja de cálculo, luego leer el csv en R y escribir un script que incluya todos los pasos de procesamiento de datos que necesito aplicar. Luego comento ese guión para tener un registro de lo que hice y por qué lo hice y no he cambiado el archivo de datos original en absoluto.
Restablecer Monica - G. Simpson

@ Jeromy: punto justo sobre las advertencias. Hace tiempo que los he filtrado como ruido para que no me molesten. Acabo de probar Gnumeric y OpenOffice.org y convierten un csv con 12/3 a fechas automáticamente, ¡eso es una basura! Entonces veo a qué te refieres. La única forma de detener eso sería almacenar esos datos como texto y forzar ese tipo de datos al cargar / importar.
Restablecer Monica - G. Simpson

@Jeromy: re: perder formato numérico: sí, lo hará, a menos que especifique el tipo de columna como "numérico" (Gnumeric) o "texto" en (OpenOffice.org) al importar. Mejor podría ser almacenarlo como texto (vea mi respuesta editada) para evitar la conversión; aún deberá especificar el tipo de datos al importar ...
Restablecer Monica - G. Simpson

3

Le sugiero que busque en google refine (http://code.google.com/p/google-refine/). Creo que es una muy buena herramienta para editar archivos CSV


¿Podría explicar cómo responde esto a la solicitud de una estrategia en la pregunta?
whuber

3

Evitaría trabajar con los archivos CSV y TSV todos juntos. En cambio, aprenda a usar SQL y opere solo en una copia de sus datos o una base de datos (DB) de sus datos o puede usar SAS o R con una conexión passthru a su base de datos. De esa manera, puede realizar actualizaciones masivas a sus datos en lugar de hacer el temido buscar y reemplazar en Excel (o cualquier programa de hoja de cálculo que esté usando) o copiar y pegar, lo que puede ser propenso a errores. La ventaja de usar un sistema de base de datos también es que puede habilitar el registro y deshacer rápidamente los cambios que ha realizado si se realizan por error y todos los cambios pueden ser auditados. Además, se pueden colocar restricciones de integridad en las tablas de la base de datos para garantizar que no actualice o cambie por error las variables / columnas de la manera que considere inapropiada (por ejemplo, las fechas se mantienen como fechas y otra información se escribe de forma apropiada). Gané'

Si le gustan las hojas de cálculo porque de alguna manera facilita su entrada de datos, eso se puede superar en todas las bases de datos que he usado utilizando las herramientas de interfaz gráfica de usuario / IDE que vienen con las bases de datos (por ejemplo, Microsoft's Management Studio) o introduciendo una versión vinculada de su base de datos en un sistema diseñado específicamente para ingresar sus datos y aplicar restricciones de datos (por ejemplo, formularios de tablas vinculadas en Access o una interfaz web personalizada). También puede usar otros programas que le permitirán obtener lo mejor de ambos mundos y actualizar datos en Excel y hacer que esos cambios se propaguen a su base de datos (consulte https://www.youtube.com/watch?v=5iyuF_mDSac por ejemplo) .


2

Después de hacer esta pregunta, comencé a echar un vistazo a CSVed .

Desde el sitio web:

CSVed es un editor de archivos CSV fácil y potente, puede manipular cualquier archivo CSV, separado con cualquier separador.

No estoy seguro si alguien tiene experiencia con eso.


Intenté instalarlo. Después de un intento rápido, parecía una basura para la entrada de datos; tal vez si lo intentara por más tiempo sería capaz de descubrir cómo usarlo de manera efectiva, pero sospecho que no.
russellpierce

¿Podría explicar cómo responde esto a la solicitud de una estrategia en la pregunta?
whuber

2

Excel no es muy amigable con CSV. Por ejemplo, si tuviera que ingresar "1.300" en Excel y guardarlo como un valor separado por comas, ¡se lo permitiría! Esto puede ser un gran problema (lo encuentro regularmente cuando recibo archivos de otros).

Yo personalmente uso OpenOffice.org Calc, también uso muchas de las soluciones enumeradas anteriormente, sin embargo, muchas de ellas no tienen la funcionalidad y la facilidad de uso que se requieren para la edición regular. OOO Calc es mucho más inteligente que Excel, aunque al ser un programa de hoja de cálculo, deberá ingresar "= 12/3" en lugar de "12/3"; de lo contrario, ingresará un valor, en lugar de un cálculo.

Dale un giro, no te decepcionará.


1

Me gusta Gnumeric porque no intenta ser tan resistente a los idiotas como los demás (no grita sobre la pérdida de funcionalidad) y funciona con grandes datos ... pero creo que es solo para Linux.


1
después de esta pregunta, hice una búsqueda: hay una versión de Windows projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim

1
Sin embargo, advierte sobre solo guardar la hoja actual (que era uno de los osos de error de Jeromy), y tiene la característica molesta de convertir números 12/3 guardados correctamente a fechas a menos que especifique manualmente que son numéricos en la importación (Datos> Obtener Datos externos> Importar archivo de texto ...) no se carga.
Restablecer Monica - G. Simpson

¿Podría explicar cómo responde esto a la solicitud de una estrategia en la pregunta?
whuber

1

Solo usa el editor de Ron . Es como Excel sin la 'ayuda'.

Desde el sitio:

Ron's Editor es un poderoso editor de texto tabular o CSV. Puede abrir cualquier formato de texto separado, incluidos los archivos estándar separados por comas y tabulaciones (CSV y TSV), y permite un control total sobre su contenido y estructura.

No solo se pueden editar archivos de texto en forma de tabla, sino que también se pueden filtrar y resumir fácilmente en tantas vistas adicionales como sea necesario, agregando una poderosa funcionalidad de análisis.

  • Licencia: Gratis para uso personal / evaluación
  • Se ejecuta en: Windows 32/64-bit 2000 / XP / 2003 / Vista /

¿Podría explicar cómo responde esto a la solicitud de una estrategia en la pregunta?
whuber

1

Personalmente, me gusta utilizar la idea de "base de datos relacional" para administrar archivos CSV. Los archivos CSV son buenos para intercambiar datos, pero no contienen lógica empresarial. Mi experiencia de trabajar con CSV es "hay muchas iteraciones con las empresas para refinar el análisis". Trabajar solo con archivos de texto sin formato (CSV) planteará muchos desafíos. Por ejemplo, el archivo CSV no mostrará "lo que hace que los datos sean únicos", es decir, cuál es la "clave principal para cada fila". Esto causará grandes problemas más adelante, cuando tengamos que unirnos a otra fuente de datos.

SQLite es una buena herramienta para convertir CSV en una base de datos relacional, y similar a CSV, es fácil de intercambiar y no se necesita configurar el servidor. Más importante aún, soportó muy bien en Ry otro software estadístico.

Mi estrategia siempre es mantener una "información limpia" en la base de datos relacional. Y manténgalo claro en la clave principal de cada tabla.

Aquí hay un ejemplo de lo que puede suceder en palabras reales (supongamos que estamos vendiendo libros):

  • El día 1, recibí un archivo CSV que contiene toda la información del cliente.
  • El día 2, recibí otro archivo CSV que contiene toda la información del producto (libro). Por alguna razón, las empresas dijeron que no había ISBN disponible y la combinación del nombre del libro y el nombre del autor es la clave principal.
  • El día 3, Business encontró que la edición del libro debe tenerse en cuenta, envían otro CSV para "sobrescribir" el CSV del día 2.
  • El día 4, la empresa encontró que la información del cliente puede actualizarse (como el cambio de dirección), envían una versión actualizada de la información del cliente.

Ahora, puede ver la ventaja de los datos limpios y mantenerlos en la base de datos relacional. Con la identificación del cliente decir como clave principal, y el nombre del libro, autor y edición como clave principal. Es muy fácil realizar actualizaciones de datos e incorporar cambios según sea necesario. Además, la clave principal también proporciona "restricciones" y "verificación de la cordura" para los nuevos datos que vienen.


0

Si utiliza la función "Importar datos" de Excel, le dará la opción de seleccionar el tipo de datos para cada columna. Puede seleccionar todas las columnas y usar el tipo de datos "Texto".


¿Podría explicar cómo responde esto a la solicitud de una estrategia en la pregunta?
whuber
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.