2010-05-04 7 views
4

Considérez ce qui suit 2 par 2 tableau:importation et d'exportation CSV sont tous deux brisés dans Mathematica

x = {{"a b c", "1,2,3"}, {"i \"comma-heart\" you", "i \",heart\" u, too"}} 

Si nous exportons que vers CSV puis l'importer à nouveau, nous ne recevons pas la même chose en arrière:

Import[Export["tmp.csv", d]] 

En regardant tmp.csv, il est clair que l'exportation n'a pas fonctionné, car les guillemets ne sont pas correctement échappés.

Selon le RFC que je présume est résumée correctement sur Wikipedia's entry on CSV, la bonne façon d'exporter le tableau ci-dessus est la suivante:

a b c, "1,2,3" 
"i ""heart"" you", "i "",heart"" u, too" 

Importation précède ne donne pas le tableau d'origine non plus. L'importation est donc également cassée.

J'ai signalé ces bogues à [email protected] mais je me demande si d'autres solutions de contournement existent entre-temps.

Une solution consiste à simplement utiliser TSV au lieu de CSV. J'ai testé ce qui précède avec TSV et il semble fonctionner (même avec des onglets intégrés dans les entrées de la matrice).

+0

Si cela vous dérange, essayez Import [Export ["string.csv", x, "CSV"]], ce qui va probablement gâcher votre journée. Pardon. –

+0

@High Performance Mark: Je l'ai essayé mais je ne vois pas de différence lors de l'utilisation du paramètre "CSV" explicite. Que voulais-tu dire? – dreeves

+1

Réponse de Wolfram: Merci d'avoir pris le temps de nous envoyer ce rapport. J'ai transmis vos exemples à notre groupe de développement. La solution recommandée à ce problème consiste à utiliser un format différent . Nous nous excusons pour la gêne occasionnée par ce problème. J'ai inclus vos informations de contact afin que vous puissiez être informé lorsque cela a été résolu. – dreeves

Répondre

2

Au lieu de TSV, une autre solution consiste à utiliser un séparateur différent:

In[26]:= str = ExportString[x, "CSV", "TextDelimiters"->"'"]; 
Out[26]= "'a b c','1,2,3' 
'i \"comma-heart\" you','i \",heart\" u, too'" 

In[27]:= y = ImportString[str, "CSV", "TextDelimiters"->"'"] 
Out[27]= {{"a b c", "1,2,3"}, {"i \"comma-heart\" you", "i \",heart\" u, too"}} 

In[28]:= x == y 
Out[28]= True 

Notez que Import/Export et ImportString/ExportString prendre les mêmes options, les dernières fonctions de lecture juste des chaînes/écriture au lieu de fichiers.

Vous pouvez également utiliser l'un des autres formats de données tabulaires/scientifiques qui prend en charge Mathematica, comme XLS, ODS, HDF, HDF5, CDF, FITS, etc.

Vous pouvez également trouver certaines d'entre elles plus rapidement car certaines d'entre elles sont binaires et rsing à faire. Tout dépend de votre application et de son utilisation en dehors de Mathematica.

+0

Bonne idée. Bien que j'imagine que nous pourrions concocter un exemple avec des guillemets simples et doubles échappés qui feraient que votre version se brise de la même façon que la mienne. – dreeves

+0

Bien sûr; Voici la nature des solutions de contournement =) Vous pouvez également utiliser l'un des autres formats de données tabulaires/scientifiques pris en charge par Mathematica, tels que XLS, ODS, HDF, HDF5, CDF, FITS, etc. Vous pouvez également trouver certains d'entre eux plus rapidement. d'entre eux sont binaires et il n'y a donc pas d'analyse textuelle à faire. Tout dépend de votre application et de son utilisation en dehors de Mathematica. –

+0

Merci Michael. Bonnes pensées; vous devriez faire cette partie de votre réponse! – dreeves