web-dev-qa-db-fra.com

Appel de fichier .csv dans Octave

J'ai un code écrit en C++ qui génère un fichier .csv avec des données sur trois colonnes (Time, Force, Height). Je veux tracer les données en utilisant Octave, ou bien utiliser la représentation de la fonction octave dans le fichier C++ (je sais que c'est possible mais je n'ai pas nécessairement besoin de le faire de cette façon).

En ce moment, j'ai le simple fichier .m: 

filename = linear_wave_loading.csv;
M = csvread(filename);

Juste pour m'entraîner à mettre ce fichier en octave (essayera de tracer après) Je reçois cette erreur. 

error: dlmread: error parsing range

Quelle est la bonne méthode pour charger des fichiers .csv en octave? 

Edit: Voici les premières lignes de mon fichier .csv

Wavelength= 88.7927 m
Time    Height  Force(KN/m)
0   -20 70668.2
0   -19 65875
0   -18 61411.9
0   -17 57256.4

Merci d'avance pour votre aide. 

7
user3460758

Utilisation de l'octave 3.8.2

>> format long g
>> dlmread ('test.csv',' ',2,0)
ans =

                     0                     0                     0                   -20               70668.2
                     0                     0                     0                   -19                 65875
                     0                     0                     0                   -18               61411.9
                     0                     0                     0                   -17               57256.4

Général, utilisez dlmread si votre séparateur de valeur n’est pas une virgule. En outre, vous devez ignorer les deux titres. Théoriquement, dlmread fonctionne aussi avec des valeurs séparées par des tabulations '\t', mais cela échoue avec votre exemple, en raison de la taille discontinue de la tabulation (peut-être qu’il s’agit simplement d’un problème de copier/coller). prendre un espace ' ' comme séparateur est une solution de contournement. vous devriez mieux sauvegarder votre fichier .csv séparé par des virgules

Wavelength= 88.7927 m
Time    Height  Force(KN/m)
0, -20, 70668.2
0, -19, 65875
0, -18, 61411.9
0, -17, 57256.4

Ensuite, vous pouvez facilement faire dlmread('file.csv',',',2,0).

Vous pouvez essayer ma fonction csv2cell (à ne pas confondre avec csv2cell du paquet io!) (Jamais essayée <3.8.0).

>> str2double(reshape(csv2cell('test.csv', ' +',2),3,4))'
ans =

                 0                   -20               70668.2
                 0                   -19                 65875
                 0                   -18               61411.9
                 0                   -17               57256.4

Généralement, il est automatiquement reconfiguré avec succès, mais dans le cas de séparateurs d'espace, il échoue souvent. Vous devez donc le remodeler vous-même (et le convertir en double dans tous les cas).

Et quand vous avez besoin de votre titre

>> reshape(csv2cell('test.csv', ' +',1),3,5)'
ans =
{
  [1,1] = Time
  [2,1] = +0
  [3,1] = +0
  [4,1] = +0
  [5,1] = +0
  [1,2] = Height
  [2,2] = -20
  [3,2] = -19
  [4,2] = -18
  [5,2] = -17
  [1,3] = Force(KN/m)
  [2,3] = 70668.2
  [3,3] = 65875
  [4,3] = 61411.9
  [5,3] = 57256.4
}

Mais faites attention, alors tout est une chaîne dans votre cellule.

8
Markus

Vous ne stockez pas votre nom de fichier .csv sous forme de chaîne. Essayez:

filename = 'linear_wave_loading.csv';
1
FrozenMonkey