Strategia per la modifica di file con valori separati da virgola (CSV)


18

Quando lavoro su progetti di analisi dei dati, spesso conservo i dati in file di dati delimitati da virgole o da tabulazioni (CSV, TSV). Mentre i dati spesso appartengono a un sistema di gestione di database dedicato. Per molte delle mie applicazioni, questo sarebbe esagerare.

Posso modificare i file CSV e TSV in Excel (o presumibilmente un altro programma di foglio di calcolo). Questo ha dei vantaggi:

  • i fogli di calcolo facilitano l'immissione dei dati

Ci sono anche diversi problemi:

  • Lavorare con i file CSV e TSV porta a una vasta gamma di messaggi di avviso su varie funzioni perse e su come verrà salvato solo il foglio attivo e così via. Pertanto, è fastidioso se si desidera solo aprire il file e apportare una piccola modifica.
  • Fa molte conversioni "apparentemente intelligenti". Ad esempio, se inserisci 12/3, penserà di voler inserire una data. AGGIORNAMENTO: avrei dovuto menzionare che l'esempio della data è solo uno dei tanti esempi; la maggior parte dei problemi sembra essere correlata a una conversione inappropriata. In particolare, i campi di testo che sembrano numeri o date causano problemi.

In alternativa, potrei lavorare direttamente con il file di testo in un editor di testo standard. Questo assicura che ciò che inserisco sia ciò che viene registrato. Tuttavia è un modo molto imbarazzante per inserire dati (le colonne non si allineano; è difficile inserire i dati semplicemente in più celle; ecc.).

Domanda

  • Qual è una buona strategia per lavorare con file di dati CSV o TSV? vale a dire, quale strategia semplifica l'inserimento e la manipolazione dei dati garantendo al contempo che ciò che si inserisce sia effettivamente interpretato correttamente?

1
Che tipo di operazioni fai effettivamente sui file? A mio avviso, ciò influisce notevolmente sulla gamma di opzioni accettabili. Inoltre, mi sembra che potresti modificare i dati TSV in un elaboratore di testi e allineare le schede per preservare le colonne - purché il tuo elaboratore di testi possa essere impostato in modo da non effettuare conversioni "intelligenti" e salvare come testo normale, che molti possono .
Wayne,

@Wayne Un buon punto. Poiché sono cresciuto con i programmi per fogli di calcolo, ci sono molte scorciatoie con cui ho familiarità (funzioni, copia e incolla, aggiunta di una colonna aggiuntiva e molto altro). Nota, non sto parlando qui dell'analisi dei dati, ma solo della creazione di un semplice file di dati tabulari (ad esempio, alcune meta informazioni necessarie per elaborare il mio codice R). Mentre potrei fare tutte queste manipolazioni di base della tabella in R, non è altrettanto intuitivo per me. Probabilmente col passare del tempo, aprendo un CSV in R, facendo alcune piccole modifiche e salvandolo di nuovo diventerà la mia opzione preferita.
Jeromy Anglim,

Risposte:


14
  1. Se hai dimestichezza con R, puoi creare il tuo data.frame di base e quindi utilizzare la funzione fix () su di esso per inserire i dati. Sulla stessa linea del numero 5, una volta impostato data.frame è possibile utilizzare una serie di readLines (n = 1) (o qualsiasi altra cosa) per ottenere i dati, convalidarli e fornire l'opportunità di aggiungere il successivo riga. Quindi lasciare il fissaggio su fix (). Vedi un esempio implementato di seguito usando scan ().

  2. Un'altra opzione in Excel sarebbe disordinata, ma potresti digitare 12/9, quindi avere un'altra colonna per valutare = IFERROR (MONTH (DateEntryCell) / DAY (DataEntryCell), DataEntryCell). Ma poi dovrai mantenere il foglio Excel E il foglio CSV e tutte le lamentele mentre scrivi il CSV persisteranno.

  3. In alternativa, a condizione che i campi siano relativamente corti e abbiano una lunghezza costante, un normale editor di testo dovrebbe essere utile con TSV. Puoi sempre caricarlo in Excel quando hai finito e assicurarti che il numero di colonne per ogni riga sia quello che ti aspetti che sia.
  4. Emacs è disponibile su diverse piattaforme e probabilmente ha qualcosa proprio per questo, ad esempio http://www.emacswiki.org/emacs/CsvMode .
  5. Se sei un'anima cordiale, programmare qualcosa di rapido in un linguaggio di programmazione per fare l'inserimento dei dati è banale, la modifica dei dati sarà molto più difficile.
  6. Una rapida ricerca su Google mostra software con questo scopo, ma nessun software libero sembra essere buono.
  7. Sembra folle, ma qualcuno su un superutente ha suggerito di modificare le tabelle in accesso e quindi di esportarle come CSV ... è abbastanza folle da funzionare.
  8. Non si evita che Excel si lamenti quando si salva come .csv, ma è possibile digitare un singolo apostrofo prima del campo di immissione dei dati e questo lo lascia da solo in termini di formattazione automatica. Bene, questo (almeno in Office 2007) non lascia apostrofi nel file CSV.

Aggiornamento: Ho cercato molto su questo problema perché è anche un problema. Finora la soluzione migliore / più semplice per l'inserimento dei dati che ho visto finora è KillinkCSV . Non è un software "gratuito", è un shareware con una durata di prova di 30 giorni e un prezzo ragionevole (~ $ 27). Non sono sicuro di quanto mi fidi per la modifica dei CSV esistenti - gli ho consegnato un CSV follemente grande (e presumibilmente ben formattato) e non è riuscito a leggere tutte le righe. Tuttavia, sembrava funzionare bene per uno che era abbastanza grande (20 MB) e il problema con il file più grande potrebbe essere un errore dell'utente da parte mia.

R Esempio:

#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ì, e risulta che ho già csv-mode.elinstallato grazie al emacs-goodies-elpacchetto in Debian / Ubuntu - pulito.
Dirk Eddelbuettel,

1
+1, Per il punto 1 tutto il software stat con cui abbia mai lavorato (oltre a R, Stata, SPSS e SAS) offre questo tipo di funzionalità. Quindi il tuo consiglio si generalizza a qualunque software con cui qualcuno vuole lavorare.
Andy W,

5

Aggiornamento: [Dopo aver passato un ampio arretrato di e-mail da R-Help] Mi viene in mente il thread su " Il comportamento diread.csv() ". In questo, Duncan Murdoch menziona che preferisce usare i file DIF (Data Interchange Format) invece di CSV per alcuni dei motivi citati da Jeromy. Ho appena provato questo e Gnumeric ha sbagliato (caricando 12/3 come data), ma OpenOffice.org lo legge correttamente e conserva intatte le informazioni 12/3. (Qualcuno ha cura di controllare questo in MS Excel?)

I file DIF sono di testo semplice e possono essere letti da fogli di calcolo e R (purché si utilizzi una revisione R recente (revisione SVN> = r53778)) leggerà i dati nel formato corretto.


Originale : proverei a evitare di utilizzare un foglio di calcolo completo per la modifica / manipolazione dei dati ogni volta che è possibile. È incredibilmente difficile, se non impossibile, documentare le modifiche apportate a un set di dati esistente in modo che praticamente lo escluda da un punto di vista della ricerca riproducibile. Al massimo, utilizzo un foglio di calcolo per visualizzare rapidamente i dati esistenti.

Per l'elaborazione dei dati, tendo a scrivere uno script R che prenderà il file CSV grezzo e applicherà tutte le fasi di elaborazione necessarie richieste. Commento pesantemente quella sceneggiatura per spiegare esattamente cosa sto facendo in ogni fase e perché. Il mio script di analisi dei dati chiamerebbe quindi lo script di elaborazione dei dati che carica ed elabora i dati.

Per l'immissione dei dati, è più complicato inserire i dati in un editor di testo o in un foglio di calcolo? Sospetto che i problemi citati per quest'ultimo non superino quelli del tentativo di inserire i dati CSV in un editor di testo.

Potresti provare un foglio di calcolo migliore; OpenOffice.org rifiuta di interrompere la formattazione del 12/3 come una data (o la converte in rappresentazione numerica) anche se si formatta prima la colonna come "numerica". Gnumeric invece lascerà 12/3 com'è se si formatta prima la colonna come "numerica".

Puoi forzare OpenOffice.org a non riformattare 12/3 come una data anteponendo 'a alle voci, ovvero '12/3verrà visualizzato come 12/3 nel foglio di calcolo e salvato come testo. Questo è probabilmente abbastanza sicuro da usare.

Non so perché vorresti che 12/3 venisse memorizzato numericamente come 12/3 nel file di testo - come dovrebbe leggerlo qualcosa come R?

Il tuo commento sugli avvertimenti sulla perdita di funzionalità o sul solo salvataggio del foglio attivo non è davvero un problema, vero? (Se lo sono, allora voglio i tuoi problemi nella mia vita ;-)


Per quanto riguarda la ricerca riproducibile, se il formato del file è CSV, il file CSV potrebbe essere facilmente messo sotto controllo della versione con commit quando vengono apportate modifiche. Basterebbe questo per la ricerca riproducibile? Per quanto riguarda l'inserimento dei dati, faccio spesso o induco altri a fare l'inserimento di dati non elaborati in un formato a larghezza fissa per massimizzare l'efficienza; tuttavia preferisco archiviare i dati in CSV o TSV (lo trovo più trasparente); per quanto riguarda la formattazione di una colonna come numerica. questa informazione sarebbe presumibilmente persa al momento del salvataggio.
Jeromy Anglim,

per quanto riguarda 12/3, ho avuto un esempio di un test a scelta multipla in cui questo rappresentava il 12 diviso per 3. Tuttavia, lo uso più come esempio illustrativo. Quando ho un file CSV di grandi dimensioni, non voglio nemmeno una conversione inappropriata. Per quanto riguarda gli avvisi, se apro i file CSV 10 volte al giorno, gli avvisi diventano noiosi. Inoltre rendono meno chiaro se ho effettivamente salvato il file CSV o meno. Scusa per il rant.
Jeromy Anglim,

@Jeromy sì, sarebbe, se fossi severo nel fare una singola modifica (o una singola fase di elaborazione dei dati) che salvi e commetti immediatamente. Intendo non includere una nota sull'elaborazione in R (poiché è la mia lingua preferita) usando uno script. È così che lavoro con i colleghi che mi inviano dati; Potrei dare una rapida occhiata in un foglio di calcolo, quindi leggere il CSV in R e scrivere uno script che includa tutte le fasi di elaborazione dei dati che devo applicare. Quindi commento quello script in modo da avere una registrazione di ciò che ho fatto e del perché l'ho fatto e non ho modificato il file di dati originale.
Ripristina Monica - G. Simpson l'

@ Jeromy: punto giusto sugli avvertimenti. Da tempo li ho filtrati come rumore in modo che non mi disturbino. Ho appena testato Gnumeric e OpenOffice.org e convertono un CSV con 12/3 in date automagicamente - questa è spazzatura! Quindi capisco cosa intendi. L'unico modo per fermarlo sarebbe archiviare quei dati come testo e forzare quel tipo di dati al caricamento / importazione.
Ripristina Monica - G. Simpson l'

@Jeromy: re: perdere la formattazione numerica - sì, a meno che non specifichi il tipo di colonna come "numerico" (Gnumeric) o "text" in (OpenOffice.org) al momento dell'importazione. Meglio potrebbe essere memorizzarlo come testo (vedi la mia risposta modificata) per evitare la conversione - dovrai comunque specificare il tipo di dati al momento dell'importazione ...
Ripristina Monica - G. Simpson

3

Ti suggerisco di consultare google refine (http://code.google.com/p/google-refine/). Penso che sia un ottimo strumento per la modifica di file CSV


Potresti spiegare come questo risponde alla richiesta di una strategia nella domanda?
whuber

3

Eviterei di lavorare insieme con i file CSV e TSV. Invece impara a usare SQL e ad operare solo su una copia di database o database (DB) dei tuoi dati oppure puoi usare SAS o R con una connessione passthru al tuo database. In questo modo è possibile effettuare aggiornamenti in blocco dei dati invece di eseguire la temuta ricerca e sostituzione in Excel (o qualsiasi programma di foglio di calcolo che si sta utilizzando) o copiare e incollare che possono essere soggetti a errori. Il vantaggio di utilizzare anche un sistema DB è che è possibile abilitare la registrazione e il rollback rapido delle modifiche apportate in caso di errore e di controllo di tutte le modifiche. Inoltre, è possibile inserire vincoli di integrità nelle tabelle del DB per assicurarsi di non aggiornare o modificare erroneamente variabili / colonne in modi ritenuti inappropriati (ad esempio, le date rimangono come date e altre informazioni vengono digitate in modo appropriato). Ho vinto'

Se ti piacciono i fogli di calcolo perché facilitano in qualche modo l'inserimento dei dati, questo può essere superato in ogni database che abbia mai usato utilizzando gli strumenti / IDE dell'interfaccia utente grafica forniti con i database (ad esempio Microsoft Management Studio) o inserendo una versione collegata del database in un sistema appositamente progettato per l'immissione dei dati e l'applicazione dei vincoli dei dati (ad esempio moduli di tabella collegati in Access o un'interfaccia Web personalizzata). Puoi anche utilizzare altri programmi che ti permetteranno di ottenere il meglio da entrambi i mondi e di aggiornare i dati in Excel e di far propagare tali modifiche al tuo database (vedi https://www.youtube.com/watch?v=5iyuF_mDSac per esempio) .


2

Dopo aver fatto questa domanda, ho iniziato a dare un'occhiata CSVed .

Dal sito Web:

CSVed è un editor di file CSV semplice e potente, puoi manipolare qualsiasi file CSV, separato con qualsiasi separatore.

Non sono sicuro che qualcuno abbia esperienza con esso.


Ho provato a installarlo. Dopo un rapido tentativo sembrava spazzatura per l'immissione dei dati; forse se ci provassi più a lungo sarei in grado di capire come usarlo in modo efficace, ma sospetto di no.
Russellpierce,

Potresti spiegare come questo risponde alla richiesta di una strategia nella domanda?
whuber

2

Excel non è molto compatibile con CSV. Ad esempio, se dovessi inserire "1.300" in Excel e salvarlo come valore separato da virgola, ciò ti permetterebbe! Questo può essere un grosso problema (lo incontro regolarmente quando ricevo file da altri).

Personalmente utilizzo OpenOffice.org Calc, utilizzo anche molte delle soluzioni sopra elencate, tuttavia molte di queste non hanno le funzionalità e la facilità d'uso necessarie per la modifica regolare. OOO Calc è molto più intelligente di Excel, sebbene sia un programma per fogli di calcolo, dovrai comunque inserire "= 12/3" anziché "12/3", altrimenti inserirai un valore anziché un calcolo.

Fai un giro, non rimarrai deluso.


1

Mi piace Gnumeric perché non cerca di essere così resistente agli idioti come gli altri (non grida sulla perdita di funzionalità) e funziona con dati di grandi dimensioni ... eppure penso che sia solo Linux.


1
seguendo questa domanda, ho fatto una caccia: esiste una versione di Windows projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim

1
avverte solo di salvare il foglio corrente (che era uno degli orsetti di Jeromy) e ha la fastidiosa funzione di convertire le cifre 12/3 correttamente salvate in date a meno che non specifichi manualmente che sono numeriche all'importazione (Dati> Ottieni Dati esterni> Importa file di testo ...) non caricati.
Ripristina Monica - G. Simpson l'

Potresti spiegare come questo risponde alla richiesta di una strategia nella domanda?
whuber

1

Usa l'editor di Ron . È proprio come Excel senza "aiuto".

Dal sito:

Ron's Editor è un potente editor di testi tabulari o CSV. Può aprire qualsiasi formato di testo separato, inclusi i file separati da virgole e tabulazioni separate (CSV e TSV) e consente il controllo totale sul loro contenuto e struttura.

Non solo i file di testo tabulari possono essere modificati, ma possono anche essere facilmente filtrati e riassunti in tutte le viste extra necessarie, aggiungendo potenti funzionalità di analisi.

  • Licenza: gratuita per uso / valutazione personale
  • Funziona su: Windows 32/64-bit 2000 / XP / 2003 / Vista /

Potresti spiegare come questo risponde alla richiesta di una strategia nella domanda?
whuber

1

Personalmente mi piace usare l'idea di "database relazionale" per gestire i file CSV. I file CSV sono utili per lo scambio di dati, ma non contengono alcuna logica aziendale. La mia esperienza di lavoro con CSV è "ci sono molte iterazioni con le imprese per affinare l'analisi". Lavorare solo con file di testo semplice (CSV) pone molte sfide. Ad esempio, il file CSV non mostrerà "ciò che rende i dati univoci", ovvero quale sia la "chiave primaria per ogni riga". Ciò causerà grossi problemi in seguito, quando avremo un'altra fonte di dati da unire.

SQLite è un buon strumento per trasformare CSV in database relazionale e, simile a CSV, è facile da scambiare e non è necessaria alcuna configurazione del server. Ancora più importante, ha supportato molto bene in Re altri software statistici.

La mia strategia è sempre quella di mantenere un "dato pulito" nel database relazionale. E tienilo chiaro sulla chiave primaria di ogni tabella.

Ecco un esempio di ciò che può accadere in parole reali (supponiamo che stiamo vendendo libri):

  • Giorno 1, ho ricevuto un file CSV contenente tutte le informazioni sui clienti.
  • Giorno 2, ho ricevuto un altro file CSV contenente tutte le informazioni sul prodotto (libro). Per qualche motivo, l'azienda ha dichiarato che non era disponibile un codice ISBN e la combinazione di nome libro e nome autore è la chiave primaria.
  • Giorno 3, Business ha scoperto che l'edizione del libro deve essere presa in considerazione, inviano un altro CSV per "sovrascrivere" il CSV del giorno 2.
  • Giorno 4, le informazioni sui clienti rilevate dall'azienda possono essere aggiornate (come la modifica dell'indirizzo), inviano una versione aggiornata delle informazioni sul cliente.

Ora puoi vedere il vantaggio di dati puliti e tenerli nel database relazionale. Con la dicitura ID cliente come chiave primaria e nome del libro, autore e edizione come chiave primaria. È molto semplice effettuare aggiornamenti dei dati e incorporare le modifiche necessarie. Anche la chiave primaria fornisce anche "vincoli" e "controllo di integrità" per i nuovi dati in arrivo.


0

Se usi la funzione "Importa dati" di Excel, ti darà la possibilità di selezionare il tipo di dati per ogni colonna. È possibile selezionare tutte le colonne e utilizzare il tipo di dati "Testo".


Potresti spiegare come questo risponde alla richiesta di una strategia nella domanda?
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.