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
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
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);
Si vous voulez vraiment traiter votre fichier ligne par ligne, une solution pourrait être d'utiliser fgetl
:
fopen
fgetl
sscanf
sur le tableau de caractères que vous venez de lireContrairement à 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.
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
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!