2013-07-05 11 views
1

J'ai un grand jeu de données dans le fichier dbf et je voudrais l'exporter vers le fichier de type csv. Merci à SO déjà réussi à le faire en douceur. Cependant, lorsque j'essaie de l'importer dans R (l'environnement dans lequel je travaille), il combine certains caractères, ce qui rend certaines lignes beaucoup plus longues qu'elles ne devraient l'être, ce qui brise toute la base de données. À la fin, chaque fois que j'importe le fichier CSV exporté, je n'ai que la moitié de la DB. Pensez que le problème principal est avec des guillemets dans les caractères de chaîne, mais en spécifiant quote="" dans R n'a pas aidé (et cela aide généralement).Copier sans les guillemets

J'ai cherché une question sur la façon de traiter les citations lors de l'exportation dans Visual FoxPro, mais je n'ai pas trouvé la réponse. Je voulais tester this mais mon ordinateur attrape erreur indiquant que je n'ai pas assez de mémoire pour terminer mon opération (probablement en raison de la grande DB).

Toute aide sera très appréciée. Je suis bloqué avec ce problème sur l'exportation de la dbf dans R assez longtemps, fouillé tout ce que je pouvais et désespérément à la recherche d'une solution simple sur la façon d'importer dbf grand à mon environnement R sans aucun bogue.

(En R: vérifié si ont des problèmes avec l'importation file et même la plupart des colonnes ont nchars beaucoup plus longtemps que il devrait y avoir, alors que le nombre de lignes divisé par deux Lire la db avec read.csv("file.csv", quote="") -> n'a pas aidé à la lecture.. data.table::fread() renvoie l'erreur

septembre ('') prévue, mais '0' Ends champ 88 sur la ligne 77980:

mais selon verbose = T cette fonction lit bon nombre de lignes (de read.csv importations seulement environ 1,5 mln rangées)

Nombre de eol après la première ligne de données: 2.811.729 Subtracted 1 pour le dernier eol et des lignes vides de fuite, laissant 2811728 lignes de données

Répondre

1

Vous devrez peut-être écrire du code pour exporter, plutôt que d'utiliser simplement la commande COPY TO ... DELIMITED.

SELECT thedbf 
mfld_cnt = AFIELDS(mflds) 

fh = FOPEN(m.filename, 1) 

SCAN 

    FOR aa = 1 TO mfld_cnt 
    mcurfld = 'thedbf.' + mflds[aa, 1] 
    mvalue = &mcurfld 
    ** Or you can use: 
    mvalue = EVAL(mcurfld) 

    ** manipulate the contents of mvalue, possibly based on the field type 
    DO CASE 
     CASE mflds[aa, 2] = 'D' 
     mvalue = DTOC(mvalue) 

     CASE mflds[aa, 2] $ 'CM' 
      ** Replace characters that are giving you problems in R 
      mvalue = STRTRAN(mvalue, ["], '') 

     OTHERWISE 
      ** Etc. 
    ENDCASE 

    = FWRITE(fh, mvalue) 
    IF aa # mfld_cnt 
     = FWRITE(fh, [,]) 
    ENDIF 

    ENDFOR 

    = FWRITE(fh, CHR(13) + CHR(10)) 
ENDSCAN 
= FCLOSE(fh) 

Notez que j'utilise [caractères] pour délimiter les chaînes qui incluent des virgules et des guillemets. Cela aide la lisibilité.

+0

Merci! Une question de plus, est-il possible de mettre toutes les colonnes dans une boucle? – Asayat

+1

Oui, en utilisant la fonction AFIELDS(). Je vais développer cela plus tard après une réunion. – LAK

+0

Ok, ajouté une boucle de colonne. – LAK

3

Lors de l'exportation au TYPE DELIMITED Vous avez un certain contrôle sur le côté VFP comme à la façon dont l'exportation formate le fichier de sortie.

Pour modifier le séparateur de champ de guillemets pour dire un caractère de conduite que vous pouvez faire:

copy to myfile.csv type delimited with "|" 

de sorte que produira quelque chose comme:

|A001|,|Company 1 Ltd.|,|"Moorfields"| 

Vous pouvez également modifier le séparateur d'une virgule à un autre personnage:

copy to myfile.csv type delimited with "|" with character "@" 

donnant

|A001|@|Company 1 Ltd.|@|"Moorfields"| 

Cela peut aider à l'analyse du côté R.

Il existe trois façons de délimiter une chaîne dans VFP - en utilisant les caractères normaux simples et doubles.Donc, pour dépouiller les citations de champs de caractère myfield1 et myfield2 dans votre fichier DBF, vous pouvez le faire dans la fenêtre de commande:

close all 
use myfile 
copy to mybackupfile 
select myfile 
replace all myfield1 with chrtran(myfield1,["'],"") 
replace all myfield2 with chrtran(myfield2,["'],"") 

et répéter pour d'autres champs et tables.

+1

... et lors de l'importation que le nouveau fichier dans R, ajoutez 'sep =" | "' à votre appel 'read.csv'. – flodel

+0

Merci, mais encore des problèmes d'importation. Je l'ai fait en premier lieu en utilisant avec _ avec le caractère ";". Mais j'ai mal compris avec le rôle de personnage, alors merci beaucoup pour l'explication! Comme pour R, lors de l'importation avec read.csv, il devrait être sep = "@" dans ce cas, puisque sep = "|" ne donnera qu'une colonne. Donc en d'autres termes, le caractère "@" fait référence à sep = "@" dans R, mais n'a aucune idée de la façon dont R peut interpréter "|" séparateur entre les colonnes. Essayé en utilisant avec "|" avec le caractère "@" et sep = "@", quote = "|" dans le côté R, mais à la fin il m'a donné encore moins de lignes o_O – Asayat

+0

Dans le dernier exemple, le "|" est un délimiteur, le "@" est le séparateur. –

0

* créer un fichier délimité par des virgules sans guillemets autour des champs de caractères copie TYPE DELIMITED AVEC « » (2 doubles guillemets)

Questions connexes