web-dev-qa-db-fra.com

Lecture d'un fichier texte dans MATLAB ligne par ligne

J'ai un fichier CSV, je veux lire ce fichier et faire des pré-calculs sur chaque ligne pour voir par exemple que cette ligne m'est utile ou non et si oui je l'enregistre dans un nouveau fichier CSV. quelqu'un peut-il me donner un exemple? plus en détail, voici à quoi ressemblent mes données: (chaîne, flottant, flottant) les nombres sont des coordonnées.

ABC,51.9358183333333,4.183255
ABC,51.9353866666667,4.1841
ABC,51.9351716666667,4.184565
ABC,51.9343083333333,4.186425
ABC,51.9343083333333,4.186425
ABC,51.9340916666667,4.18688333333333

fondamentalement, je veux enregistrer les lignes qui ont des distances supérieures à 50 ou 50 dans un nouveau fichier.Le champ de chaîne doit également être copié. Merci

17
Hossein

Vous pouvez réellement utiliser xlsread pour accomplir cela. Après avoir placé vos exemples de données ci-dessus dans un fichier 'input_file.csv', voici un exemple montrant comment obtenir les valeurs numériques, les valeurs de texte et les données brutes dans le fichier à partir des trois sorties de xlsread :

>> [numData,textData,rawData] = xlsread('input_file.csv')

numData =     % An array of the numeric values from the file

   51.9358    4.1833
   51.9354    4.1841
   51.9352    4.1846
   51.9343    4.1864
   51.9343    4.1864
   51.9341    4.1869


textData =    % A cell array of strings for the text values from the file

    'ABC'
    'ABC'
    'ABC'
    'ABC'
    'ABC'
    'ABC'


rawData =     % All the data from the file (numeric and text) in a cell array

    'ABC'    [51.9358]    [4.1833]
    'ABC'    [51.9354]    [4.1841]
    'ABC'    [51.9352]    [4.1846]
    'ABC'    [51.9343]    [4.1864]
    'ABC'    [51.9343]    [4.1864]
    'ABC'    [51.9341]    [4.1869]

Vous pouvez ensuite effectuer le traitement dont vous avez besoin sur les données numériques, puis réenregistrer un sous-ensemble des lignes de données dans un nouveau fichier en utilisant xlswrite . Voici un exemple:

index = sqrt(sum(numData.^2,2)) >= 50;  % Find the rows where the point is
                                        %   at a distance of 50 or greater
                                        %   from the Origin
xlswrite('output_file.csv',rawData(index,:));  % Write those rows to a new file
9
gnovice

Vous ne pouvez pas lire les chaînes de texte avec csvread. Voici une autre solution:

fid1 = fopen('test.csv','r'); %# open csv file for reading
fid2 = fopen('new.csv','w'); %# open new csv file
while ~feof(fid1)
    line = fgets(fid1); %# read line by line
    A = sscanf(line,'%*[^,],%f,%f'); %# sscanf can read only numeric data :(
    if A(2)<4.185 %# test the values
        fprintf(fid2,'%s',line); %# write the line to the new file
    end
end
fclose(fid1);
fclose(fid2);
7
yuk

Si vous voulez vraiment traiter votre fichier ligne par ligne, une solution pourrait être d'utiliser fgetl:

  1. Ouvrez le fichier de données avec fopen
  2. Lire la ligne suivante dans un tableau de caractères en utilisant fgetl
  3. Récupérez les données dont vous avez besoin en utilisant sscanf sur le tableau de caractères que vous venez de lire
  4. Effectuer tout test pertinent
  5. Exportez ce que vous voulez dans un autre fichier
  6. Revenons au point 2 si vous n'avez pas atteint la fin de votre dossier.

Contrairement à la réponse précédente, ce n'est pas vraiment dans le style de Matlab mais cela pourrait être plus efficace sur de très gros fichiers.

J'espère que cela vous aidera.

7
Adrien

Il suffit de le lire dans MATLAB en un seul bloc

fid = fopen('file.csv');
data=textscan(fid,'%s %f %f','delimiter',',');
fclose(fid);

Vous pouvez ensuite le traiter à l'aide de l'adressage logique

ind50 = data{2}>=50 ;

ind50 est alors un index des lignes où la colonne 2 est supérieure à 50. Donc

data{1}(ind50)

répertorie toutes les chaînes pour les lignes d'intérêt. Ensuite, utilisez simplement fprintf pour écrire vos données dans le nouveau fichier

5
Adrian

voici le doc pour lire un csv: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvread.html et pour écrire: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvwrite.html

ÉDITER

Un exemple qui fonctionne:

file.csv:

 1,50,4,1 
 2,49,4,2 
 3,30,4,1 
 4,71,4.9 
 5,51,4,5 
 6,61,4.1 

le code :

 Fichier = csvread ('fichier.csv') 
 [M, n] = taille (Fichier) 
 Index = 1 
 Temp = 0 
 pour i = 1: m 
 si (Fichier (i, 2)> = 50) 
 temp = temp + 1 
 fin 
 fin 
 Matrice = zéros (temp, 3) 
 
 Pour j = 1: m 
 Si (Fichier (j, 2)> = 50) 
 Matrice (index , 1) = Fichier (j, 1) 
 Matrice (index, 2) = Fichier (j, 2) 
 Matrice (index, 3) = Fichier (j, 3) 
 index = index + 1 
 end 
 end 
 csvwrite ('outputFile.csv', Matrix) 

et le résultat du fichier de sortie:

 1,50,4.1 
 4,71,4.9 
 5,51,4.5 
 6,61,4.1 

Ce n'est probablement pas la meilleure solution mais ça marche! Nous pouvons lire le fichier CSV, contrôler la distance de chaque ligne et l'enregistrer dans un nouveau fichier.

J'espère que cela vous aidera!

3
Michaël