2009-07-08 6 views
1

J'ai un énorme fichier CSV qui a un mélange de types de données numériques et de texte. Je veux lire ceci dans une seule matrice dans Matlab. Je vais utiliser un exemple plus simple ici pour illustrer mon problème. Disons que j'ai ce fichier CSV:Comment lire les champs de texte dans MATLAB et créer une seule matrice

1,foo 
2,bar 

Je suis en train de lire ceci dans MatLab en utilisant:

A=fopen('filename.csv'); 
B=textscan(A,'%d %d', 'delimiter',','); 
C=cell2mat(B); 

Les deux premières lignes fonctionnent très bien, mais le problème est que texscan ne crée pas Matrice 2x2; à la place, il crée une matrice 1x2 avec chaque valeur étant un tableau. J'essaie donc d'utiliser la dernière ligne pour combiner les tableaux en une seule grande matrice, mais cela génère une erreur car les tableaux ont des types de données différents.

Existe-t-il un moyen de contourner ce problème? Ou une meilleure façon de combiner les tableaux?

Répondre

4

Je suis sûr que si leur combinaison est une bonne idée. Il est probable que vous feriez mieux de les séparer.

j'ai changé votre code, afin qu'il fonctionne mieux:

clear 
clc 
A=fopen('filename.csv'); 
B=textscan(A,'%d %s', 'delimiter',',') 
fclose(A) 

En regardant les résultats

K >> B {1}

ans =

 1 
     2 

K >> B {2}

ans =

'foo' 
'bar' 

Vraiment, je pense que c'est le format qui est le plus utile. Si quoi que ce soit, la plupart des gens veulent briser ce réseau de cellules en petits morceaux

num = B{1} 
txt = B{2} 

Pourquoi vous essayez de les combiner? Ils sont déjà ensemble dans un réseau de cellules, et c'est le plus combiné que vous obtiendrez.

+0

Je les combine afin de créer une matrice qui servira de variables dépendantes dans une régression MCO.J'ai un certain nombre de champs de texte qui devront être convertis en variables fictives (par exemple, les champs qui disent "vrai" ou "faux" seront convertis en 1 ou 0). J'avais l'intention de coller le texte dans la matrice, puis de le parcourir et de convertir les champs si nécessaire. Mais selon votre suggestion, peut-être est-il préférable de convertir les choses pendant qu'elles sont encore dans les tableaux, puis de les combiner? Après que tout a été converti, est-il conseillé d'utiliser cell2mat pour combiner? Merci Doug! – Jack7890

+1

Vous pouvez garder ces derniers dans une structure: data.num = num = donnees.txt txt Cela les garder dans un récipient, et vous permettent de les renvoyer comme des noms plus intuitifs. Les mettre dans un tableau de cellules rendrait simplement la syntaxe pour les lire et les manipuler plus difficilement sans autre avantage que de les combiner. J'irais avec la structure. – MatlabDoug

+0

@ Jack7890: Si vous voulez * vraiment * combiner les tableaux individuels dans une matrice, vous devez d'abord convertir tout le contenu du tableau en un même type de données. Par exemple, disons que le tableau ['foo'; 'bar'] stocké dans B {2} devient [3; 4]. Pour concaténer horizontalement les tableaux en [1 3; 2 4], faites ce qui suit: C = [B {:}]; Pour concaténer verticalement les tableaux en [1; 2; 3; 4], faites ceci à la place: C = vertcat (B {:}); – gnovice

-1

Je crois que vous ne pouvez pas utiliser de textcan à cette fin. J'utiliserais fscanf qui vous donne toujours une matrice comme spécifié. Si vous ne connaissez pas la disposition des données, cela devient un peu compliqué.

fscanf fonctionne comme suit:

fscanf(fid, format, size) 

où fid est le fid généré par le format fopen

est le format de fichier & la façon dont vous lisez les données ([ '% d' '' '% s'] fonctionnerait pour votre fichier d'exemple)

taille est les dimensions de la matrice ([2 2] fonctionnerait sur votre fichier d'exemple).

0

Il existe une solution naturelle à cela, mais elle nécessite la boîte à outils Statistiques (version 6.0 ou supérieure). Les types de données mixtes peuvent être lus dans un tableau de jeu de données. Voir la page d'aide de Mathworks here.

Questions connexes