18 votos

Estrategia de edición de archivos de valores separados por comas (CSV)

Cuando trabajo en proyectos de análisis de datos, suelo almacenar los datos en archivos delimitados por comas o tabulaciones (CSV, TSV). En cambio, los datos suelen almacenarse en un sistema de gestión de bases de datos específico. Para muchas de mis aplicaciones, esto sería exagerar.

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

  • las hojas de cálculo facilitan la introducción de datos

También hay varios problemas:

  • Trabajar con archivos CSV y TSV lleva a una amplia gama de mensajes de advertencia sobre diversas características que se pierden y cómo sólo se guardará la hoja activa y así sucesivamente. Por lo tanto, es molesto si sólo desea abrir el archivo y hacer un pequeño cambio.
  • Hace muchas conversiones "supuestamente inteligentes". Por ejemplo, si introduces 12/3, pensará que quieres introducir una fecha. ACTUALIZACIÓN: Debería haber mencionado que el ejemplo de la fecha es sólo uno de muchos ejemplos; la mayoría de los problemas parecen estar relacionados con una conversión inadecuada. En particular, los campos de texto que parecen números o fechas causan problemas.

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

Pregunta

  • ¿Cuál es una buena estrategia para trabajar con ficheros de datos CSV o TSV? Es decir, ¿qué estrategia facilita la introducción y manipulación de los datos y, al mismo tiempo que lo que se introduce se interpreta correctamente?

15voto

BBlake Puntos 310
  1. Si se siente cómodo con R, puede crear su data.frame básico y luego utilizar la función fix() en él para introducir los datos. En la misma línea que #5, una vez que configure el data.frame puede utilizar una serie de readLines(n=1) (o lo que sea) para obtener sus datos, validarlos, y la oportunidad de añadir la siguiente fila. A continuación, deje la fijación de fijar(). Vea un ejemplo implementado abajo usando scan().

  2. Otra opción en Excel sería desordenado, pero usted podría escribir en 12/9, y luego tener otra columna evaluar =IFERROR(MES(FechaEntradaCelda)/DÍA(DatosEntradaCelda),DatosEntradaCelda). Pero entonces tendrás que mantener la hoja excel Y la hoja csv y todas las quejas al escribir el csv persistirán.

  3. Alternativamente, mientras sus campos sean relativamente cortos y tengan una longitud consistente, un editor de texto normal debería servirle bien con TSV. Siempre puedes cargarlo en Excel cuando hayas terminado y asegurarte de que el número de columnas de cada fila es el que esperas.

  4. Emacs está disponible en varias plataformas y probablemente tenga algo para esto, por ejemplo http://www.emacswiki.org/emacs/CsvMode .

  5. Si eres un alma caritativa, 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 rápida búsqueda en Google muestra software precisamente con este propósito, pero ningún software libre parecía ser bueno.

  7. Parece una locura, pero alguien en superusuario sugirió editar tablas en access y luego exportarlas como CSV... eso es una locura como para que funcione.

  8. No impide que Excel se queje cuando guardas como .csv, pero puedes escribir un solo apóstrofe antes del campo de entrada de datos y eso hace que lo deje en paz en términos de autoformato. Muy bien, esto (en Office 2007 al menos) no deja apóstrofes en el archivo csv.

Actualización: He estado hurgando mucho en este problema porque es un tema que también tengo. Hasta ahora la mejor solución para la entrada de datos que he visto es KillinkCSV . No es un software "gratuito", es shareware con una duración de prueba de 30 días y un precio razonable (~$27). No estoy seguro de cuánto confío en él para la edición de CSVs existentes, sin embargo - le entregué un insanamente grande (y presumiblemente bien formateado) CSV 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 usuario 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"))

5voto

David J. Sokol Puntos 1730

Actualización: [Después de haber estado revisando una gran cantidad de correos electrónicos de R-Help, me acordé del hilo sobre " El comportamiento de read.csv() ". En él, Duncan Murdoch menciona que prefiere utilizar Formato de intercambio de datos (DIF) en lugar de csv por alguna de las razones que menciona Jeromy. Acabo de probarlo y Gnumeric se equivoca (carga el 12/3 como fecha), pero OpenOffice.org lo lee correctamente y conserva la información del 12/3 intacta. (¿Alguien puede comprobarlo en MS Excel?)

Los archivos DIF son texto plano y pueden ser leídos por hojas de cálculo y R (siempre que utilice una revisión reciente de R (revisión SVN >= r53778)) leerá los datos en el formato correcto.


Original : Yo trataría de evitar el uso de una hoja de cálculo y punto para la edición de datos / manipulación siempre que sea posible. Es increíblemente difícil, si no imposible, documentar cualquier cambio que se haga en un conjunto de datos existente, por lo que queda prácticamente descartado desde el punto de vista de la investigación reproducible. Como mucho, utilizo una hoja de cálculo para ver rápidamente los datos existentes.

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

Para introducir los datos, ¿es más complicado hacerlo en un editor de texto o en una hoja de cálculo? Sospecho que los problemas que mencionas para esta última no superan a los de intentar introducir datos CSV en un editor de texto.

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

Puede forzar a OpenOffice.org a que no reformatee el 12/3 como fecha añadiendo un prefijo ' 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ías 12/3 almacenado numéricamente como 12/3 en el archivo de texto - ¿cómo debería algo como R leer esto?

Tu comentario sobre las advertencias sobre la pérdida de funciones o que sólo se guarde la hoja activa no son realmente problemas, ¿verdad? (Si lo son, entonces quiero tus problemas en mi vida ;-)

3voto

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

3voto

Dario Castañé Puntos 131

Yo evitaría trabajar con archivos CSV y TSV. En su lugar, aprenda a utilizar SQL y opere sólo con una copia de sus datos en un datamart o base de datos (DB), o puede utilizar SAS o R con una conexión passthru a su base de datos. De este modo, podrá realizar actualizaciones masivas de los datos en lugar de realizar la temida operación de buscar y reemplazar en Excel (o en el programa de hoja de cálculo que esté utilizando) o copiar y pegar, que puede ser propensa a errores. La ventaja de utilizar un sistema de base de datos es que puede activar el registro y revertir rápidamente los cambios realizados si se han hecho por error y todos los cambios pueden ser auditados. Además, se pueden aplicar restricciones de integridad a las tablas de la base de datos para garantizar que no se actualizan o modifican por error variables o columnas de forma que se considere inapropiada (por ejemplo, las fechas se mantienen como fechas y el resto de la información se convierte adecuadamente). Ni siquiera voy a entrar en las sutilezas de la seguridad de sus datos en una base de datos frente a un archivo de texto (sería especialmente importante trabajar con una base de datos y protegerla adecuadamente si sus datos contienen información sensible o de identificación personal).

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

2voto

Eric Davis Puntos 1542

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

Del sitio web:

CSVed es una herramienta puede manipular cualquier archivo CSV separado con cualquier separador.

No sé si alguien tiene experiencia con ello.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X