La lecture et le traitement d'un grand fichier texte dans Matlab
Je suis en train de lire un gros fichier texte (quelques millions de lignes) dans Matlab. D'abord j'ai été en utilisant importdata(file_name), ce qui semblait être un concis de la solution. Cependant j'ai besoin d'utiliser Matlab 7 (ouais je sais que c'est vieux) et il semble importdata n'est pas pris en charge. En tant que tel, j'ai essayé le suivant:
while ~feof(fid)
fline = fgetl(fid);
fdata{1,lno} = fline ;
lno = lno + 1;
end
Mais c'est vraiment lent. Je suppose que c'est parce que son redimensionnement du tableau à chaque itération. Est-il un meilleur moyen de le faire. En gardant à l'esprit les 20 premières lignes de l'entrée de données sont de type chaîne de données et le reste des données est de 3 à 6 colonnes de valeurs hexadécimales.
OriginalL'auteur trican | 2011-05-10
Vous devez vous connecter pour publier un commentaire.
vous aurez à faire un remodelage, mais une autre option pour vous être que vous pourriez utiliser fread.
Mais comme il a été dit, essentiellement, cela vous enferme dans une forme rectangulaire à l'importation. Une autre option serait d'utiliser textscan. Comme je le mentionne dans une autre note, je ne suis pas sûr à 100% lorsqu'il a été mis en œuvre, tout ce que je sais est que vous n'avez pas de "importdata()"
avec l'utilisation de textscan, vous serez en mesure d'obtenir une matrice de cellules de caractères pour chaque ligne que vous pouvez ensuite manipuler comme vous le souhaitez. Et comme je le dis dans mon commentaire, ce n'est plus la question de savoir si les lignes sont de la même longueur ou non. MAINTENANT, vous pouvez analyser la matrice de cellules de plus en plus rapidement. Mais comme gnovice mentionne, et il fait aussi un très élégant solution, vous pouvez avoir à vous soucier des exigences de la mémoire.
La seule chose que vous ne voulez pas utiliser dans matlab si vous pouvez l'éviter, les structures de boucle. Ils sont rapides en C/C++, etc, mais dans matlab, ils sont la façon la plus lente d'obtenir où vous allez.
EDIT: Juste regardé, et il semble que textscan a ÉTÉ mis en œuvre littéralement dans la version 7 (R14), donc si c'est ce que vous avez, vous devriez être bon d'utiliser.
Oh maintenant, vous êtes juste tester mes compétences ici 🙂 j'ai édité mon post pour refléter d'une façon que vous pouvez obtenir sans avoir les lignes de la même longueur.
Bonne prise sur TEXTSCAN. Je n'étais pas sûr si c'était encore disponible dans la Version 7. Mon FSCANF solution basée sur le fait essentiellement la même chose, mais avec plus de frappe :).
Oui, c'est pourquoi j'ai upvoted la vôtre. C'est une très belle solution qui utilise beaucoup de solutions de contournement pour potentiellement les fonctions manquantes. Lorsque Matlab n'a pas une fonction pour ça, ou alors que la boucle est presque jamais un bon endroit pour commencer! J'aurais plutôt écris mes propres MEX plutôt que de souffrir par le biais de quelques milliards d'itérations d'une boucle à chaque fois 🙂
Cela fonctionne comme un charme grâce dynamphorous!
OriginalL'auteur dynamphorous
Je vois deux options:
Chaque fois
lno
atteint une puissance de 2 (par exemple), puis concaténerfdata
avec un 1xlno
matrice de cellules vides, les matrices, c'est à direfdata = [fdata cell(1,lno)]
.Vous pouvez également développer en attribuant à un élément au-delà de la fin:
fdata(end*2) = fdata(1);
. Fonctionne sur la plupart des types de données.OriginalL'auteur Oliver Charlesworth
Une solution est de lire la totalité du contenu du fichier sous forme de chaîne de caractères avec FSCANF, fractionner la chaîne dans des cellules individuelles dans les points où les caractères de saut de ligne se produisent en utilisant MAT2CELL, supprimer l'espace blanc supplémentaire sur les extrémités avec STRTRIM, puis les processus de la chaîne de données dans chaque cellule en tant que de besoin. Par exemple, à l'aide de cet exemple de fichier texte
'junk.txt'
:Le code suivant va mettre chaque ligne dans une cellule d'une cellule de tableau
cellData
:Maintenant, si vous voulez convertir toutes les données hexadécimales (lignes 3 à 6 dans mon exemple de fichier de données) à partir de chaînes de vecteurs de nombres, vous pouvez utiliser CELLFUN et SSCANF comme suit:
REMARQUE: Car vous avez affaire à de tels tableaux de grande taille, vous devez être conscient de la quantité de mémoire utilisée par vos variables. La solution ci-dessus est vectorisé, mais peut prendre beaucoup de mémoire. Vous pourriez avoir à remplacer ou claire grandes variables comme
strData
lorsque vous créezcellData
. Alternativement, vous pourriez en boucle sur les élémentsnCharPerLine
et de traiter individuellement chaque segment de la plus grande chaîne destrData
dans les vecteurs dont vous avez besoin, que vous pouvez préallouer maintenant que vous savez comment beaucoup de lignes de données que vous avez (c'est à direnDataLines = numel(nCharPerLine)-nHeaderLines;
).OriginalL'auteur gnovice