Matlab lire dans un fichier txt dans un tableau
J'ai un fichier texte avec le format suivant de l'information:
Name1 34 25 36 46
Name1 23 53 15 86
Name1 25 25 87 35
Name2 76 22 44 55
Name2 88 88 88 88
Name3 11 11 11 11
Name3 55 66 88 88
Name3 88 88 88 88
Name3 00 00 00 00
Il y a différents "Noms" et je dois organiser chaque nom dans un tableau fente. J'aurais alors besoin d'un autre moyen de les affecter la date associée à chaque ligne à cet endroit. Ainsi, par exemple, la première Nom1 peut avoir array{0}, mais j'ai aussi besoin de l'associer à l'34, 24, 36 et 46 en quelque sorte. J'aurais également besoin de distinguer les noms différents les uns des autres. Quelle est la meilleure façon de le faire? une 2x2 tableau ne semble pas être la solution.
Ce que j'ai à ce jour est quelque chose le long des lignes de ce:
%# read the whole file to a temporary cell array
fid = fopen(filename,'rt');
tmp = textscan(fid,'%s','Delimiter','\n');
fclose(fid);
%# remove the lines starting with headerline
tmp = tmp{1};
idx = cellfun(@(x) strcmp(x(1:10),'headerline'), tmp);
tmp(idx) = [];
%# split and concatenate the rest
result = regexp(tmp,' ','split');
result = cat(1,result{:});
%# delete temporary array (if you want)
clear tmp
Courtoisie: Lire fichier txt dans Matlab
Quelqu'un pourrait-il me dire la meilleure façon d'organiser l'information? Merci, l'aide est très apprécié.
OriginalL'auteur intl | 2012-09-18
Vous devez vous connecter pour publier un commentaire.
À en juger par le code, pourquoi n'utilisez-vous pas
textscan
utilise de l'espace et de saut de ligne comme délimiteurs par défaut. Si vous donnez de retour à la ligne comme séparateur explicitement, vous perdez de l'espace comme délimiteur, et la portabilité (Windows utilise souvent\r\n
comme un seul saut de ligne, alors que Unix, dérivé de Systèmes d'exploitation utilisation\n
). Donc, compte tenu de vos données, il suffit de laisser.Alors vous sauter à travers des cerceaux pour supprimer 10 headerlines, tandis que
textscan
a déjà une belle cuite-en option pour cela. Donc, ces étapes ne sont pas nécessaires. Vous passez par le fractionnement de la substance par un passage à traversregexp
avec un espace comme séparateur, mais depuistextscan
déjà se divise sur l'espace, qui ne sont pas nécessaires.Donc, en utilisant les trois lignes ci-dessus, vous obtiendrez
Maintenant, maintenant, pour stocker les données de façon plus pratique. Je pense à deux manières:
Pour les deux, vous aurez à trouver les noms uniques première:
À l'aide de matrices de cellules de
Cela vous donnera une cellule-matrice des données triées par nom:
Maintenant, vous pouvez indice dans
results
comme suit:Rappelez-vous que Matlab est de 1 à base, de sorte que
a(3)
indique le 3ème élément dea
, pas la 4e.Répartition de la commande:
La fonction
arrayfun
une boucle sur les éléments du tableau d'entrée, applique une fonction à chaque élément, et recueille les résultats dans un tableau normal (si possible) ou une cellule de tableau (lors de l'impossible (erreur) et quand'uniformoutput', false
). C'est un peu comme unforeach
-construire.De prendre le tableau d'entrée égale à la unique
names
trouvé dans la première étape, le truc, c'est la fonction à appliquer à chaque nom. La fonction@(x) data(strcmp(tmp{1},x),:)
trouve d'abord les indices de la le nom donné danstmp{1}
(tableau contenant tous les noms) à l'aide destrcmp
. Ces indices sont ensuite utilisées pour l'indice dedata = [tmp{2:end}]
, c'est à dire, tous les autres tableaux.Les résultats pour chaque nom unique est ensuite stockée dans la cellule-matrice de
results
.À L'Aide De Structures
Vous pouvez aller plus loin et d'utiliser la cellule-matrice de
results
plus lisible la structure de données. Après l'application de toutes les étapes précédentes, l'exécuter:Maintenant, vous pouvez vous référer à vos données par un nom:
La syntaxe
your_struct.('someString')
est appelé structure dynamique de référencement. Il fait référence ou crée un champ dans la structureyour_struc
appelésomeString
.Maintenant, si
names{ii}
contient des caractères de soulignement vous voulez vous débarrasser de, vous pouvez définirou
pour les espaces. Ensuite, utilisez
Bravo à ces gars-là pour que la dernière.
Vous pouvez utiliser des structures, ou des cellules. Voir mon edit
OriginalL'auteur Rody Oldenhuis
Tout d'abord, vous devez absolument lire les données en utilisant la méthode proposée par Rody (+1 pour Rody pour le pointage), donc je vais supposer que vous avez obtenu loin et avoir une variable appelée tmp comme dans Rody l'exemple de code.
Maintenant, si je comprends bien le problème correctement, vous devez être en mesure de faire la distinction entre chaque ligne de votre exemple dataset à partir d'autres lignes (à l'aide de dates?) mais en même temps, vous avez aussi besoin de faire facilement la distinction entre les différents noms, dont certains seront les mêmes sur plusieurs lignes (encore une fois, je reçois ce à partir de votre exemple dataset).
Une manière possible d'aborder ce (qui n'ont certes un inconvénient) est d'utiliser une structure. Je vais supposer que vous avez obtenu la variable tmp dans Rody réponse et nous allons aller à partir de là. Utilisez le code:
Ce code permet de créer une structure où le premier niveau au sein de la structure a un nom de champ pour chaque nom unique dans l'ensemble de données (j'ai aussi inclus dans le code de la variable
NameVec
dans le premier niveau de la structure, de sorte qu'il peut être utilisé pour référencer les différents champs plus tard avec une boucle). Puis à l'intérieur de chaque champ (Nom1, Nom2, et Nom3 dans cet exemple), j'ai enregistré une matrice de données contenant les données associées à ce nom (d'où les différentes lignes sont conservés).L'inconvénient de cette approche est que si vous voulez obtenir TOUTES les données en arrière dans un grand tableau, vous aurez besoin de faire une boucle sur les éléments de la Structure.NameVec et de récupérer les données de la matrice associée à chaque nom unique. Et les boucles sont lents dans matlab. Alors, vraiment, cela dépend de la façon dont vous prévoyez d'utiliser les données.
Espérons que cette aide!
ps, si vous n'êtes pas familier avec matlab structures, exécutez ce code:
et puis exécutez le code que j'ai fourni ci-dessus sur
tmp
. Puis un coup d'oeil à la structure qui en résulte, appeléeStruct
dans le matlab variable de l'éditeur. Cela devrait vous donner une idée de la façon dont ils travaillent.OriginalL'auteur Colin T Bowers