2017-03-15 2 views
0

J'ai un format de fichier à largeur fixe (l'original a été saisi pour une routine Fortran). Plusieurs lignes du fichier ressemblent le ci-dessous:Octave/Matlab - Lecture d'un fichier de largeur fixe

1078.0711005.481 932.978 861.159 788.103 716.076 

Comment cela devrait en fait lire:

1078.071 1005.481 932.978 861.159 788.103 716.076 

J'ai essayé différentes méthodes, textscan, fgetl, fscanf etc, mais le problème que j'ai est, comme vu ci-dessus, parfois en raison de la largeur fixe des fichiers d'origine il n'y a pas d'espace entre certains des nombres. Je ne peux pas sembler trouver un moyen de les lire directement et je ne peux pas changer le format original.

Le meilleur que je suis venu avec est si loin d'utiliser fgetl qui lit la ligne entière dans, je refaçonner le résultat dans un tableau 8,6

A=fgetl 
A=reshape(A,8,6) 

qui génère le résultat suivant

11 
009877 
703681 
852186 
...... 
049110 
787507 
118936 

Alors maintenant, j'ai ce qui précède et pensé que je pourrais être en mesure de concaténer les lignes de ce tableau pour former chaque numéro, bien que ce soit difficile semblant aussi bien avoir essayé strcat, vertcat etc.

Tout cela semble un long chemin alors espérait de meilleures suggestions.

Merci.

+0

Si l'espacement des colonnes est le même, même si elles sont écrasées ensemble, vous pourriez faire str2double (A (1: 8)) et str2double (A (9:16)) et ainsi de suite pour le reste de la ligne. Tant que la longueur de la colonne ne change pas, cela peut aider. Je n'ai pas accès MATLAB ou le temps pour faire une réponse complète – fyrepenguin

Répondre

1

Si vous pouvez compter sur trois nombres décimaux, vous pouvez utiliser une expression régulière simple pour générer les blancs manquants:

s = '1078.0711005.481 932.978 861.159 788.103 716.076'; 
s = regexprep(s, '(\.\d\d\d)', '$1 '); 
c = textscan(s, '%f'); 

maintenant c{1} contient vos numéros. Cela fonctionnera également si s est en fait le fichier entier au lieu d'une ligne.

+0

Merci, les deux réponses ci-dessus aidé, je vais accepter celui-ci comme quelque chose de très similaire est ce que j'utilise, je n'avais pas pensé à utiliser un regexprep . – user2551578

0

Vous n'avez pas mentionné la classe de sortie dont vous aviez besoin, mais je suppose que vous devez lire les doubles du fichier pour effectuer des calculs. Je suppose que vous êtes en mesure de lire votre fichier puisque vous avez déjà des résultats de reshape() fonction. Cependant, l'utilisation de la fonction reshape() ne sera pas efficace dans votre cas, car vos variables ne sont pas de taille fixe (par exemple, 1078.071 et 932.978).

Si je did't mal comprendre votre problème:

  1. Vos données sont écrasées dans certaines parties (i.e. 1078.0711005.481 au lieu de 1078,071 1005,481).

  2. La partie fractionnaire des variables a 3 chiffres.

d'abord tout ce que nous devons nous débarrasser des espaces du tableau de chaînes:

A = A(~ismember(A,' ')); 

Ensuite, en utilisant les informations que les fractions sont 3 chiffres:

iter = length(strfind(A, '.')); 
for k=1:iter 
    [stat,ind] = ismember('.', A); 
    B(k)=str2double(A(1:ind+3)); 
    A = A(ind+4:end); 
end 

B sera un tableau de doubles en conséquence.