1
votes

Importation ligne par ligne délimitée par des tabulations ASCII avec des espaces dans les valeurs

Matlab ne divise pas correctement les lignes délimitées par des tabulations avec des espaces entre les mots. Comment faire fonctionner cela?

Par exemple, disons que j'ai un fichier avec ces deux lignes que je veux extraire, la première est une ligne d'en-tête et la seconde est une ligne de données:

splitted = split(line, '\t')

(les délimiteurs sont des tabulations mais je les montre ici avec plusieurs espaces)

J'ai écrit un analyseur personnalisé qui devrait aboutir à un tableau avec:

field1       field2     field3
______       ______     ______
  14           A        String

Ce que je vois est quelque chose comme:

field1       field2      field3
______       ______      ______
  14        A String      34.1

J'ai une solution utilisant la ligne de la fonction split () par ligne avec fgetl , cela fonctionne s'il n'y a pas d'espaces dans les entrées. Faire:

#DATA_NAME    field1    field2    field3
DATA_NAME    14    A String    34.1

ne semble pas fonctionner. J'ai fait quelques vérifications, et les délimiteurs ne == '\ t' ...

(Je dois utiliser mon analyseur personnalisé car il y a beaucoup de types de données différents dans un fichier, chacun avec différents nombres de colonnes et différents en-têtes.)


0 commentaires

3 Réponses :


1
votes

Question similaire à celle-ci ici . Vous pouvez essayer:

C = textscan(fopen(filename),'%s %d %s %d');

Cette ligne ajoute une cellule C avec toutes les valeurs. Consultez la documentation textcan de Matlab.


0 commentaires

1
votes

utilisez char (09) au lieu de '\t'

Je ne peux pas les lister exactement mais j'ai remarqué que certains analyseurs de chaînes Matlab reconnaissent '\ t' comme un caractère TAB correct, mais certains autres ne le reconnaissent pas et le traitent comme 2 caractères séparés '\' et 't' .

exemple:

>> double('\t')
ans =
    92   116
>> double(tabc)
ans =
     9

Cela m'a causé des problèmes même en utilisant textcan dans le passé, donc maintenant sauf pour fprintf où je sais que ça marche, partout ailleurs j'utilise toujours le code ascii 09 pour le caractère de tabulation, au lieu de la notation abrégée '\ t' .

Par exemple:

tabc = char(09) ;
C= textscan( s , '%s' , 'delimiter',tabc ) ; % or in any other function using 'delimiters'

Et pour illustrer le premier exemple:

>> double('\t')
ans =
    92   116


0 commentaires

0
votes

Cela fonctionnera pour le fractionnement par tabulation:

splitted = strsplit(aLineOfText, '\t');

(Cela traite les lignes différemment et m'a fait retravailler mon script, mais semble fonctionner correctement.)

p>


0 commentaires