У меня есть файл CSV, я хочу считать этот файл и сделать некоторые предварительные вычисления на каждой строке, чтобы видеть, например, что строка полезна для меня или не и если да я сохраняю его к новому файлу CSV. кто-то может дать мне пример? более подробно это - то, как мои данные похожи: (строка, плавание, плавание), числа являются координатами.
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
в основном я хочу сохранить строки, которые имеют для расстояний, больше чем 50 или 50 в новом строковом поле file.the должны также быть скопированы.спасибо
Для этого можно использовать xlsread
. После того, как вы сначала поместили образец данных выше в файл 'input_file.csv'
, вот пример того, как вы можете получить числовые значения, текстовые значения и необработанные данные в файле из трех выходных данных из 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]
Затем вы можете выполнить любую необходимую обработку числовых данных, а затем повторно сохранить подмножество строк данных в новый файл, используя xlswrite
. Вот пример:
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
Вы не можете читать текстовые строки с помощью csvread. Вот еще одно решение:
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);
Просто прочтите его в MATLAB в одном блоке
fid = fopen('file.csv');
data=textscan(fid,'%s %f %f','delimiter',',');
fclose(fid);
Затем вы можете обработать его, используя логическую адресацию
ind50 = data{2}>=50 ;
ind50 - это индекс строк где столбец 2 больше 50. Таким образом,
data{1}(ind50)
перечислит все строки для интересующих строк.Затем просто используйте fprintf
, чтобы записать данные в новый файл
Если вы действительно хотите обрабатывать свой файл построчно, решением может быть использование fgetl
:
fopen
fgetl
sscanf
в массиве символов, который вы только что прочитали В отличие от предыдущего ответа, это не очень похоже на стиль Matlab, но он может быть более эффективным для очень больших файлов.
Надеюсь, это поможет.
вот документ для чтения csv: http: //www.mathworks.com/access/helpdesk/help/techdoc/ref/csvread.html и написать: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvwrite.html
EDIT
Пример, который работает:
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
код:
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)
и результат в выходном файле:
1,50,4.1 4,71,4.9 5,51,4.5 6,61,4.1
Это, вероятно, не лучшее решение, но оно работает! Мы можем прочитать файл CSV, контролировать расстояние до каждой строки и сохранить его в новом файле.
Надеюсь, это поможет!