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
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
si vous voulez vraiment traiter votre ligne de fichier par ligne, une solution pourrait être d'utiliser fgetl
:
- Ouvrir le fichier de données avec
fopen
- Lire la ligne suivante dans un tableau de caractères en utilisant
fgetl
- Retreive les données dont vous avez besoin en utilisant
sscanf
sur le tableau de caractères que vous venez de lire - Effectuer tout test
- Sortie ce que vous voulez à un autre fichier
- 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.
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);
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
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!