Stratégie de modification des fichiers de valeurs séparées par des virgules (CSV)

18

Lorsque je travaille sur des projets d'analyse de données, je stocke souvent des données dans des fichiers de données séparés par des virgules ou des tabulations (CSV, TSV). Alors que les données appartiennent souvent à un système de gestion de base de données dédié. Pour bon nombre de mes demandes, ce serait exagérer.

Je peux modifier des fichiers CSV et TSV dans Excel (ou probablement un autre programme de feuille de calcul). Cela présente des avantages:

  • les feuilles de calcul facilitent la saisie des données

Il existe également plusieurs problèmes:

  • L'utilisation de fichiers CSV et TSV entraîne un large éventail de messages d'avertissement concernant la perte de diverses fonctionnalités et la façon dont seule la feuille active sera enregistrée, etc. Ainsi, c'est ennuyeux si vous voulez juste ouvrir le fichier et faire un petit changement.
  • Il effectue de nombreuses conversions «supposées intelligentes». Par exemple, si vous entrez 12/3, il pensera que vous voulez entrer une date. MISE À JOUR: J'aurais dû mentionner que l'exemple de date n'est qu'un exemple parmi tant d'autres; la plupart des problèmes semblent être liés à une conversion inappropriée. En particulier, les champs de texte qui ressemblent à des nombres ou des dates posent des problèmes.

Alternativement, je pourrais travailler directement avec le fichier texte dans un éditeur de texte standard. Cela garantit que ce que j'entre est ce qui est enregistré. Cependant, c'est une façon très maladroite de saisir des données (les colonnes ne s'alignent pas; il est difficile de saisir des données simplement dans plusieurs cellules, etc.).

Question

  • Quelle est la bonne stratégie pour travailler avec des fichiers de données CSV ou TSV? c'est-à-dire, quelle stratégie facilite la saisie et la manipulation des données tout en garantissant que ce que vous saisissez est effectivement interprété correctement?
Jeromy Anglim
la source
1
Quel type d'opérations effectuez-vous réellement sur les fichiers? Dans mon esprit, cela affecte considérablement la gamme d'options acceptables. En outre, il me semble que vous pouvez modifier les données TSV dans un traitement de texte et aligner les onglets pour conserver les colonnes - tant que votre traitement de texte peut être configuré pour ne pas effectuer de conversions «intelligentes» et peut enregistrer en texte clair, ce que beaucoup peuvent .
Wayne
@Wayne Bon point. Parce que j'ai grandi avec des tableurs, il existe de nombreux raccourcis que je connais (fonctions, copier-coller, ajouter une colonne supplémentaire, et bien plus). Remarque, je ne parle pas ici de l'analyse des données, mais simplement de la création d'un simple fichier de données tabulaires (par exemple, certaines méta-informations nécessaires pour traiter mon code R). Bien que je puisse faire toutes ces manipulations de table de base dans R, ce n'est pas aussi intuitif pour moi. Probablement avec le temps, ouvrir un csv dans R, faire quelques petits changements et le sauvegarder à nouveau deviendra mon option préférée.
Jeromy Anglim

Réponses:

14
  1. Si vous êtes à l'aise avec R, vous pouvez créer votre data.frame de base, puis utiliser la fonction fix () dessus pour saisir des données. Dans la même veine que # 5, une fois que vous avez configuré le data.frame, vous pouvez utiliser une série de readLines (n = 1) (ou autre) pour obtenir vos données, les valider et vous donner la possibilité d'ajouter le suivant rangée. Laissez ensuite la fixation à fixer (). Voir un exemple implémenté ci-dessous utilisant scan ().

  2. Une autre option dans Excel serait compliquée, mais vous pouvez taper 12/9, puis avoir une autre colonne evaluer = IFERROR (MONTH (DateEntryCell) / DAY (DataEntryCell), DataEntryCell). Mais alors vous devrez maintenir la feuille Excel ET la feuille csv et toutes les plaintes pendant que vous écrivez le csv persisteront.

  3. Alternativement, tant que vos champs sont relativement courts et ont une longueur cohérente, un éditeur de texte régulier devrait bien vous servir avec TSV. Vous pouvez toujours le charger dans Excel lorsque vous avez terminé et vous assurer que le nombre de colonnes pour chaque ligne correspond à ce que vous attendez.
  4. Emacs est disponible sur un certain nombre de plates-formes et a probablement quelque chose juste pour cela, par exemple http://www.emacswiki.org/emacs/CsvMode .
  5. Si vous êtes une âme chaleureuse, la programmation de quelque chose de rapide dans un langage de programmation pour faire la saisie de données est triviale, l'édition des données sera beaucoup plus difficile.
  6. Une recherche rapide sur Google montre un logiciel dans ce but, mais aucun logiciel gratuit ne semble être bon.
  7. Cela semble insensé, mais quelqu'un sur super-utilisateur a suggéré de modifier les tables dans Access puis de les exporter au format CSV ... c'est juste assez fou pour fonctionner.
  8. Cela n'empêche pas Excel de se plaindre lorsque vous enregistrez au format .csv, mais vous pouvez taper une seule apostrophe avant votre champ de saisie de données et cela le laisse tranquille en termes de mise en forme automatique. Eh bien, cela (dans Office 2007 au moins) ne laisse pas d'apostrophes dans le fichier csv.

Mise à jour: J'ai beaucoup fouillé sur ce problème car c'est aussi un problème que j'ai. Jusqu'à présent, la solution la meilleure / la plus simple pour la saisie de données que j'ai vue jusqu'à présent est KillinkCSV . Ce n'est pas un logiciel "gratuit", c'est un shareware avec une durée d'essai de 30 jours et un prix raisonnable (~ 27 $). Je ne sais pas à quel point je lui fais confiance pour éditer les CSV existants - je lui ai remis un CSV incroyablement grand (et probablement bien formaté) et il n'a pas réussi à lire toutes les lignes. Cependant, cela semblait bien fonctionner pour un fichier raisonnablement volumineux (20 Mo) et le problème avec le fichier plus volumineux peut être une erreur de ma part.

Exemple R:

#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"))
russellpierce
la source
Oui, et il s'avère que j'ai déjà csv-mode.elinstallé grâce au emacs-goodies-elpaquet dans Debian / Ubuntu - soigné.
Dirk Eddelbuettel
1
+1, pour le point n ° 1, tous les logiciels de statistiques avec lesquels j'ai travaillé (à l'exception de R, Stata, SPSS et SAS) fournissent ce type de fonctionnalité. Vos conseils se généralisent donc à tous les logiciels avec lesquels quelqu'un souhaite travailler.
Andy W
5

Mise à jour: [Après avoir parcouru un important arriéré de courriels de R-Help], je me souviens du fil de discussion sur " Le comportement deread.csv() ". Dans ce document, Duncan Murdoch mentionne qu'il préfère utiliser les fichiers DIF (Data Interchange Format) au lieu de csv pour certaines des raisons que Jeromy mentionne. Je viens d'essayer cela et Gnumeric se trompe (en chargeant le 12/3 comme date), mais OpenOffice.org le lit correctement et préserve les informations du 12/3 intactes. (Quelqu'un veut-il vérifier cela dans MS Excel?)

Les fichiers DIF sont en texte brut et peuvent être lus par des feuilles de calcul et R (tant que vous utilisez une révision R récente (révision SVN> = r53778)) lira les données dans le format correct.


Original : j'essaierais d'éviter d'utiliser une feuille de calcul à l'arrêt complet pour l'édition / la manipulation des données dans la mesure du possible. Il est incroyablement difficile, voire impossible, de documenter les modifications que vous apportez à un ensemble de données existant, de sorte que cela l'exclut pratiquement d'un point de vue de recherche reproductible. Tout au plus, j'utilise une feuille de calcul pour visualiser rapidement les données existantes.

Pour le traitement des données, j'ai tendance à écrire un script R qui prendra le fichier csv brut et appliquera toutes les étapes de traitement nécessaires. Je commente fortement ce script pour expliquer exactement ce que je fais à chaque étape et pourquoi. Mon script d'analyse de données appelle alors le script de traitement des données qui charge et traite les données.

Pour la saisie de données, est-ce plus compliqué de saisir les données dans un éditeur de texte ou dans une feuille de calcul? Je soupçonne que les problèmes que vous mentionnez pour ce dernier ne l'emportent pas sur ceux d'essayer d'entrer des données CSV dans un éditeur de texte.

Vous pourriez essayer une meilleure feuille de calcul; OpenOffice.org refuse d'arrêter le formatage 12/3 en tant que date (ou il le convertit en représentation numérique) même si l'on formate d'abord la colonne en "numérique". Gnumeric en revanche laissera 12/3 tel qu'il est si vous formatez d'abord la colonne en "numérique".

Vous pouvez forcer OpenOffice.org à ne pas reformater 12/3 en tant que date en ajoutant un préfixe 'aux entrées, c'est-à-dire qu'il '12/3sera affiché comme 12/3 dans la feuille de calcul et enregistré sous forme de texte. C'est probablement assez sûr à utiliser.

Vous ne savez pas pourquoi vous souhaitez que 12/3 soit stocké numériquement sous la forme 12/3 dans le fichier texte - comment quelque chose comme R devrait-il lire ceci?

Vos commentaires sur les avertissements concernant la perte de fonctionnalités ou l'enregistrement de la feuille active ne sont pas vraiment des problèmes, n'est-ce pas? (S'ils le sont, alors je veux vos problèmes dans ma vie ;-)

Réintégrer Monica - G. Simpson
la source
En ce qui concerne la recherche reproductible, si le format de fichier est CSV, le fichier CSV pourrait facilement être placé sous contrôle de version avec des validations lorsque des modifications sont apportées. Cela suffirait-il pour une recherche reproductible? En ce qui concerne la saisie de données, je fais ou demande souvent à d'autres de faire la saisie de données brutes dans un format de largeur fixe afin de maximiser l'efficacité; cependant je préfère stocker les données en CSV ou TSV (je les trouve plus transparentes); en ce qui concerne le formatage d'une colonne en tant que numérique. cette information serait vraisemblablement perdue lors de la sauvegarde.
Jeromy Anglim
en ce qui concerne 12/3, j'avais un exemple de test à choix multiples où cela représentait le 12 divisé par 3. Cependant, je l'utilise plus comme exemple illustratif. Lorsque j'ai un gros fichier CSV, je ne veux même pas une seule conversion inappropriée. En ce qui concerne les avertissements, si j'ouvre les fichiers CSV 10 fois par jour, les avertissements deviennent fastidieux. Ils indiquent également moins clairement si j'ai réellement enregistré le fichier CSV ou non. Désolé pour la diatribe.
Jeromy Anglim
@ Jeromy oui, ce serait le cas, si vous étiez strict à propos d'une seule modification (ou d'une seule étape de traitement des données) que vous enregistrez et validez immédiatement. Je ne veux pas inclure une note sur le traitement en R (car c'est ma langue préférée) en utilisant un script. C'est ainsi que je travaille avec les données que mes collègues m'envoient; Je pourrais jeter un coup d'œil dans une feuille de calcul, puis lire le csv dans R et écrire un script qui comprend toutes les étapes de traitement des données dont j'ai besoin pour appliquer. Je commente ensuite ce script afin d'avoir un enregistrement de ce que j'ai fait et pourquoi je l'ai fait et je n'ai pas du tout changé le fichier de données d'origine.
Rétablir Monica - G. Simpson
@Jeromy: juste point sur les avertissements. Je les ai depuis longtemps filtrés en bruit afin qu'ils ne me dérangent pas. Je viens de tester Gnumeric et OpenOffice.org et ils convertissent un csv avec 12/3 en dates de manière automatique - c'est de la foutaise! Je vois donc ce que tu veux dire. La seule façon d'arrêter cela serait de stocker ces données sous forme de texte et de forcer ce type de données lors du chargement / de l'importation.
Rétablir Monica - G. Simpson
@ Jeromy: re: perte de la mise en forme numérique - oui, sauf si vous spécifiez le type de colonne "numérique" (Gnumeric) ou "texte" dans (OpenOffice.org) lors de l'importation. Mieux vaut peut-être le stocker sous forme de texte (voir ma réponse modifiée) pour éviter la conversion - vous devrez toujours spécifier le type de données lors de l'importation ...
Rétablir Monica - G. Simpson
3

Je vous suggère de regarder google affiner (http://code.google.com/p/google-refine/). Je pense que c'est un très bon outil pour éditer des fichiers CSV


la source
Pourriez-vous expliquer comment cela répond à la demande de stratégie dans la question?
whuber
3

J'éviterais de travailler avec les fichiers CSV et TSV tous ensemble. Au lieu de cela, apprenez à utiliser SQL et à n'opérer que sur un datamart ou une copie de base de données (DB) de vos données ou vous pouvez utiliser SAS ou R avec une connexion relais à votre base de données. De cette façon, vous pouvez effectuer des mises à jour en masse de vos données au lieu de faire la recherche et le remplacement redoutés dans Excel (ou tout autre programme de feuille de calcul que vous utilisez) ou de copier et coller qui peuvent être sujets à des erreurs. L'avantage de l'utilisation d'un système de base de données est également que vous pouvez activer la journalisation et annuler rapidement les modifications que vous avez apportées si elles sont faites par erreur et que toutes les modifications peuvent être auditées. De plus, des contraintes d'intégrité peuvent être placées sur vos tables de base de données pour vous assurer de ne pas mettre à jour ou modifier par erreur des variables / colonnes d'une manière que vous jugez inappropriée (par exemple, les dates restent telles que les dates et d'autres informations sont converties de manière appropriée). J'ai gagné'

Si vous aimez les feuilles de calcul parce qu'elles facilitent en quelque sorte votre saisie de données, cela peut être surmonté dans toutes les bases de données que j'ai jamais utilisées en utilisant les outils d'interface utilisateur graphique / IDE fournis avec les bases de données (par exemple Microsoft's Management Studio) ou en extrayant une version liée de votre base de données dans un système spécialement conçu pour saisir vos données et appliquer les contraintes de données (par exemple, les formulaires de table liés dans Access ou une interface Web personnalisée). Vous pouvez également utiliser d'autres programmes qui vous permettront d'obtenir le meilleur des deux mondes et de mettre à jour les données dans Excel et de faire propager ces modifications dans votre base de données (voir https://www.youtube.com/watch?v=5iyuF_mDSac par exemple) .

StatsStudent
la source
2

Après avoir posé cette question, j'ai commencé à jeter un œil à CSVed .

Depuis le site Web:

CSVed est un éditeur de fichiers CSV simple et puissant, vous pouvez manipuler n'importe quel fichier CSV, séparé avec n'importe quel séparateur.

Je ne sais pas si quelqu'un en a l'expérience.

Jeromy Anglim
la source
J'ai essayé de l'installer. Après un essai rapide, cela semblait être un déchet pour la saisie de données; peut-être que si je l'essayais plus longtemps, je serais en mesure de comprendre comment l'utiliser efficacement, mais je ne pense pas.
russellpierce
Pourriez-vous expliquer comment cela répond à la demande de stratégie dans la question?
whuber
2

Excel n'est pas très convivial pour CSV. Par exemple, si vous deviez saisir "1 300" dans Excel et l'enregistrer en tant que valeur séparée par des virgules, cela vous permettrait! Cela peut être un gros problème (je le rencontre régulièrement lors de la réception de fichiers par d'autres).

J'utilise personnellement OpenOffice.org Calc, j'utilise également bon nombre des solutions énumérées ci-dessus, mais bon nombre d'entre elles n'ont pas les fonctionnalités et la facilité d'utilisation requises pour une édition régulière. OOO Calc est beaucoup plus intelligent qu'Excel, bien qu'étant un tableur, vous devrez toujours entrer "= 12/3" au lieu de "12/3" sinon vous entrerez une valeur, plutôt qu'un calcul.

Donnez-lui un tourbillon, vous ne serez pas déçu.

Adam
la source
1

J'aime Gnumeric car il n'essaie pas d'être aussi résistant aux idiots que les autres (il ne crie pas sur les fonctionnalités perdues) et fonctionne avec de grandes données ... pourtant je pense que c'est uniquement Linux.


la source
1
suite à cette question, j'ai fait une chasse: il existe une version Windows projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim
1
il avertit cependant de ne sauvegarder que la feuille actuelle (qui était l'un des bogues de Jeromy), et il a la fonction ennuyeuse de convertir des chiffres 12/3 correctement enregistrés en dates, sauf si vous spécifiez manuellement qu'ils sont numériques lors de l'importation (Data> Get Données externes> Importer un fichier texte ...) ne se charge pas.
Rétablir Monica - G. Simpson
Pourriez-vous expliquer comment cela répond à la demande de stratégie dans la question?
whuber
1

Utilisez simplement l'éditeur de Ron . C'est comme Excel sans l'aide.

Depuis le site:

L'éditeur de Ron est un puissant éditeur de texte tabulaire, ou CSV. Il peut ouvrir n'importe quel format de texte séparé, y compris les fichiers standard séparés par des virgules et des tabulations (CSV et TSV), et permet un contrôle total sur leur contenu et leur structure.

Non seulement les fichiers texte tabulaires peuvent être modifiés, mais ils peuvent également être facilement filtrés et résumés dans autant de vues supplémentaires que nécessaire, ajoutant une puissante fonctionnalité d'analyse.

  • Licence: gratuite pour usage personnel / évaluation
  • Fonctionne sur: Windows 32/64 bits 2000 / XP / 2003 / Vista /
Aaron Stewart
la source
Pourriez-vous expliquer comment cela répond à la demande de stratégie dans la question?
whuber
1

Personnellement, j'aime utiliser l'idée de "base de données relationnelle" pour gérer les fichiers CSV. Les fichiers CSV sont bons pour l'échange de données, mais ne contiennent aucune logique métier. Mon expérience de travail avec CSV est "il existe de nombreuses itérations avec les entreprises pour affiner l'analyse". Travailler uniquement avec des fichiers texte brut (CSV) posera de nombreux défis. Par exemple, le fichier CSV n'affichera pas "ce qui rend les données uniques", c'est-à-dire quelle est la "clé primaire de chaque ligne". Cela posera de gros problèmes plus tard, lorsque nous aurons d'autres sources de données à rejoindre.

SQLite est un bon outil pour faire de CSV une base de données relationnelle et, comme CSV, il est facile à échanger et aucune configuration de serveur n'est nécessaire. Plus important encore, il a très bien pris en charge Rles logiciels statistiques et autres.

Ma stratégie est toujours de maintenir des "données nettoyées" dans la base de données relationnelle. Et restez clair sur la clé primaire de chaque table.

Voici un exemple de ce qui peut arriver en vrai mot (supposons que nous vendons des livres):

  • Jour 1, j'ai reçu un fichier CSV contenant toutes les informations clients.
  • Jour 2, j'ai reçu un autre fichier CSV contenant toutes les informations sur le produit (livre) .Pour une raison quelconque, l'entreprise a déclaré qu'aucun ISBN n'était disponible et que la combinaison du nom du livre et du nom de l'auteur était la clé primaire.
  • Le jour 3, l'édition de livre trouvée par les entreprises doit être prise en compte, ils envoient un autre CSV pour "écraser" le CSV du jour 2.
  • Le jour 4, les informations sur les clients trouvés peuvent être mises à jour (comme le changement d'adresse), ils envoient une version mise à jour des informations sur les clients.

Maintenant, vous pouvez voir l'avantage des données propres et les conserver dans la base de données relationnelle. Avec l'ID client par exemple comme clé primaire et le nom du livre, l'auteur et l'édition comme clé primaire. Il est très facile de faire des mises à jour de données et d'incorporer des modifications au besoin. De plus, la clé primaire donne également des «contraintes» et un «contrôle d'intégrité» pour les nouvelles données à venir.

Haitao Du
la source
0

Si vous utilisez la fonction «Importer des données» d'Excel, elle vous donnera la possibilité de sélectionner le type de données pour chaque colonne. Vous pouvez sélectionner toutes les colonnes et utiliser le type de données "Texte".

roundsquare
la source
Pourriez-vous expliquer comment cela répond à la demande de stratégie dans la question?
whuber