CSVファイルがあります。このファイルを読み、各行で事前計算を行い、たとえばその行が自分にとって有用かどうかを確認し、はいの場合は新しいCSVファイルに保存します。誰かが私に例を与えることができますか?より詳細には、これは私のデータがどのように見えるかです:(string、float、float)数値は座標です。
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以上の距離を持つ行を保存したいです。文字列フィールドもコピーする必要がありますありがとう
実際に xlsread
を使用してこれを達成できます。最初に上記のサンプルデータをファイルに配置した後'input_file.csv'
、これは xlsread
からの3つの出力からファイルの数値、テキスト値、および生データを取得する方法の例です。
>> [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);
ファイルを1行ずつ処理したい場合、解決策はfgetl
を使用することです。
fopen
でデータファイルを開きますfgetl
を使用して次の行を文字配列に読み込みますsscanf
を使用して必要なデータを取得します前の答えとは異なり、これはMatlabのスタイルではあまりありませんが、非常に大きなファイルではより効率的です。
これが役立つことを願っています。
1つのブロックで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
を使用して、新しいファイルにデータを書き出します。
ここにcsvを読むためのドキュメントがあります: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvread.html そして書く: http:/ /www.mathworks.com/access/helpdesk/help/techdoc/ref/csvwrite.html
編集
動作する例:
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ファイルを読み取り、各行の距離を制御して、新しいファイルに保存できます。
それが役立つことを願っています!