MATLAB: à l'Aide de textscan et la conversion de matrice de cellules dans la matrice
J'ai un gros fichier csv (environ 1 million de lignes) avec l'option de données avec la structure suivante (contenu est modifié):
secid, date, days, delta, impl_volatility, impl_strike, impl_premium, dispersion, cp_flag, ticker, index_flag, industry_group
100000, 02/05/1986, 60, -80, 0.270556, 74.2511, 5.2415, 0.021514, C, ASC, 0, 481
100000, 03/05/1986, 30, -40, 0.251556, 74.2571, 6.2415, 0.025524, P, ASC, 0, 481
J'ai réussi à importer un fichier de test en utilisant les éléments suivants:
ftest = fopen('test.csv');
C = textscan(ftest,'%f %s %f %f %f %f %f %f %s %s %f %f','Headerlines',1,'Delimiter',',');
fclose(ftest);
Cependant, C est une matrice de cellules et de ce fait, il est plus difficile de gérer le contenu du fichier dans matlab. Il serait plus facile de l'avoir comme "régulier", array (pardonnez-moi de ne pas connaître la nomenclature correcte, j'ai juste commencé à travailler avec matlab).
Si je sortie C, j'obtiens:
Columns 1 through 6
[2x1 double] {2x1 cell} [2x1 double] [2x1 double] [2x1 double] [2x1 double]
Columns 7 through 12
[2x1 double] [2x1 double] {2x1 cell} {2x1 cell} [2x1 double] [2x1 double]
Donc à l'intérieur de la cellule du tableau qui est en C, il y a des tableaux et des matrices de cellules de tableaux pour les numéros et les cellules des tableaux de chaînes de caractères. Si j'essaie de vérifier élément (1,2), je dois utiliser C{1}(2) mais si je veux vérifier l'élément (2,2) - je utiliser C{2}{2}. Idéalement, je voudrais accéder à la fois à C(1,2) et C(2,2).
La question est, comment puis-je faire cela?
J'ai cherché des solutions et a trouvé cells2mat mais il ne fonctionne que si tout le contenu est numérique (je pense). J'ai trouvé cette solution: Convertir des cellules de tableau de tableaux de cellules à la matrice de matrices mais horzcat récupère une erreur, qui, je crois, peut occurr en raison du même problème.
Je vous remercie d'avance pour votre temps.
OriginalL'auteur sasstudent | 2013-07-15
Vous devez vous connecter pour publier un commentaire.
Que vous avez un tableau contenant à la fois numériques et des données de caractère, ce que vous voulez, c'est impossible (et croyez-moi, il serait peu pratique, trop).
Référence différents nombres dans un tableau numérique est différente de référencement de l'ensemble des chaînes. Il est tout simplement échapper que, ne doit pas être: vous traitez les fleurs différemment de la façon dont vous traitez les gens (je l'espère en tout cas).
Dans MATLAB, une chaîne de caractères est un tableau ordinaire, à la différence que chaque entrée du tableau ne représente pas un nombre, mais un personnage. Référencement des caractères individuels en va de la même référencer les chiffres dans les tableaux:
Cependant,
textscan
suppose (à juste titre) que vous ne voulez pas faire que, mais plutôt que vous voulez extraire ensemble des chaînes à partir du fichier. Et l'ensemble des chaînes doit être référencé de façon différente, pour indiquer que vous voulez dire l'ensemble des chaînes et non les caractères individuels.Je pense que vous allez trouver tout cela un peu plus intuitive si vous séparez les résultats de
textscan
en ordinaires d'un tableau numérique et d'une cellule de tableau de chaînes de caractères, comme suit:Le référencement des données dans
numeric
puis suit les mêmes règles que n'importe quel tableau ordinaire, et de référencement sur les chaînes dealpha
suit alors la cellule normale-règles de référence (comme dansalpha{2,1}
pour obtenir'03/05/1986'
)MODIFIER Basé sur vos commentaires, vous voulez faire la conversion comme ceci:
ftest = fopen('testfile2.csv'); C = textscan(ftest,'%f %s %f %f %f %f %f %f %s %s %f %f','Headerlines',1,'Delimiter',','); fclose(ftest); for i=1:size(C{9}) C{2}{i} = datenum(C{2}{i}, 'dd/mm/yyyy'); if C{9}{i} == 'P' C{9}{i} = 1; elseif C{9}{i} == 'C' C{9}{i} = 2; end end C{2} = cell2mat(C{2}); C{9} = cell2mat(C{9}); C = [C{[1 2 3 4 5 6 7 8 9 11 12]}]
Tandis que votre approche n'est pas mal, j'ai édité dans une version plus courte, plus rapide et plus MATLABy 🙂
Merci beaucoup @Rody, il est très rapide comme ça. Il traite les 1052480 lignes du fichier en environ 10 secondes. Merci beaucoup!
OriginalL'auteur Rody Oldenhuis
J'ai eu le même problème...je préfère avoir un 2-D de la cellule de tableau pour faciliter l'accès et l'utilisation de l'intégré dans matlab fonctions de tri.
Voici une autre solution qui pourrait fonctionner pour vous (c'est de cette façon TMW t-il dans leur code généré automatiquement dans l'outil d'importation). Il tourne le numérique des tableaux dans des tableaux de cellules, de sorte que vous pouvez les enchaîner dans un 2-D de la matrice.
OriginalL'auteur andrewhunter