2016-06-07 7 views
0

Je suis un programmeur autodidacte assez novice utilisant Scilab. J'ai des fichiers .csv que je veux lire. Ce sont des valeurs textuelles et numériques mixtes, et ont un nombre variable de colonnes et de lignes. La partie du fichier qui m'intéresse a un nombre fixe de colonnes mais pas de lignes. Je peux sauter la première partie en utilisant l'argument en-tête mais j'ai aussi des cellules en bas dont je n'ai pas besoin. Un exemple de ce qu'il pourrait ressembler à:Est-il possible d'avoir une plage variable et des colonnes en utilisant csvRead dans Scilab 5.5.2

DATA,1,0,3,3960.4,3236,3373,-132 
DATA,1,0,4,4544.5,3530,3588,-76 
RANDOM TEXT,0 
INFO,1,0,#+BHO0 _:WRF&-11,S%00-0-03-1  
INFO,2,1,#*BHO0 _8WRF&-11,NAS%00-0-15-1 

Je suis seulement intéressé par les lignes qui commencent par DATA. Si je tente d'exécuter csvRead sans enlever les lignes ci-dessous je reçois cette erreur:

Warning: Inconsistency found in the columns. At line 4993, found 2 columns 
while the previous had 8. 

J'ai actuellement un programme qui va lire le fichier et de le manipuler au besoin, mais je dois aller dans chaque fichier et supprimez le bas lignes Y a-t-il un moyen de contourner ceci?

Mon programme actuel ressemble à ceci:

D = uigetfile([".csv"],"path", "Choose a file name", %t); 
filename = fullfile(D); 
sub = ["DATA" "0"]; 

//Import data 
data = csvRead(filename, ',', [], 'string', sub, [], [], 34); 
edit(filename) 
//determine # of rows 
data_size = size(data); 
limit = data_size(1); 

Toutes les idées?

Répondre

0

Il n'est pas possible de spécifier que csvRead doit ignorer les lignes avec moins de colonnes, ou utiliser un ensemble par défaut ou quoi que ce soit (ce qui serait bien). Une solution de contournement pourrait être dans votre cas, pour analyser uniquement les lignes commençant par DATA. Cela peut être accompli avec Regular Expressions.

L'argument regexpcomments de csvRead donne la possibilité d'ignorer des lignes dans le fichier csv correspondant à une certaine expression régulière. À côté de cela, il est également possible d'écrire une expression régulière qui correspond à toutes les chaînes qui ne pas correspondre à un certain motif:

/^(?:(?!PATTERN).)*$/; # Matches strings not containing PATTERN 

L'application de cette regex dans votre cas, conduirait que toutes les lignes pas contenant PATTERN, doivent être considérés comme des commentaires et seront donc ignorés.

Dans le code, cela signifie quelque chose comme ce qui suit.

filename = fullfile('data.csv'); 
sub = ["DATA" "0"]; 

//Import data 
number_of_header_lines = 1 
read_only_lines_starting_with = 'DATA' 
regexp_magic = '/^(?:(?!' + read_only_lines_starting_with + ').)*$/' 

data = csvRead(filename, ',', [], 'string', sub, regexp_magic, [], number_of_header_lines); 

disp(data) 
+0

Merci beaucoup! Travaillé parfaitement! – user6437423