Lire un fichier texte dans MATLAB ligne par ligne

j'ai un fichier CSV, je veux lire ce fichier et faire quelques pré-calculs sur chaque ligne pour voir par exemple que la ligne est utile pour moi ou pas et si oui je l'enregistre dans un nouveau fichier CSV. quelqu'un peut-il me donner un exemple? pour plus de détails,voici à quoi ressemblent mes données: (string,float, float) 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 pour des distances plus de 50 ou 50 dans un nouveau fichier.le champ de chaîne doit également être copié. merci

17
demandé sur Amro 2010-05-18 14:42:02

5 réponses

Vous pouvez utiliser xlsread pour accomplir cette tâche. Après avoir placé vos données d'échantillon ci-dessus dans un fichier 'input_file.csv', voici un exemple pour comment vous pouvez 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 alors effectuer n'importe quel traitement dont vous avez besoin sur les données numériques, puis resaver un sous-ensemble des lignes de données à 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
répondu gnovice 2017-10-17 16:33:52

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

  1. Ouvrir le fichier de données avec fopen
  2. Lire la ligne suivante dans un tableau de caractères en utilisant fgetl
  3. Retreive 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
  5. Sortie ce que vous voulez à un autre fichier
  6. retour au point 2 Si vous n'avez pas atteint la fin de votre fichier.

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

J'espère que cela aidera.

7
répondu Adrien 2010-05-18 14:33:45

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
répondu yuk 2017-11-29 13:05:30

Viens de lire dans MATLAB dans un bloc

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

vous pouvez alors le traiter en utilisant l'adressage logique

ind50 = data{2}>=50 ;

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

data{1}(ind50)

liste de toutes les chaînes pour les lignes d'intérêt. Puis il suffit d'utiliser fprintf pour écrire vos données vers le nouveau fichier

5
répondu Adrian 2010-05-18 14:53:33

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

EDIT

Un exemple qui fonctionne :

fichier.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 :

File = csvread('file.csv')
[m,n] = size(File)
index=1
temp=0
for i = 1:m
    if (File(i,2)>=50)
        temp = temp + 1
    end
end
Matrix = zeros(temp, 3)

for j = 1:m
    if (File(j,2)>=50)
        Matrix(index,1) = File(j,1)
        Matrix(index,2) = File(j,2)
        Matrix(index,3) = File(j,3)
        index = index + 1
    end
end
csvwrite('outputFile.csv',Matrix)

et le fichier de sortie résultat :

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 vous pouvez lire le fichier CSV, contrôler la distance de chaque ligne et l'enregistrer dans un nouveau fichier.

j'Espère que ça aidera!

3
répondu Michaël 2010-05-18 14:02:21