web-dev-qa-db-ja.com

MATLABのテキストファイルを1行ずつ読み取る

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以上の距離を持つ行を保存したいです。文字列フィールドもコピーする必要がありますありがとう

17
Hossein

実際に 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
9
gnovice

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);
7
yuk

ファイルを1行ずつ処理したい場合、解決策はfgetlを使用することです。

  1. fopenでデータファイルを開きます
  2. fgetlを使用して次の行を文字配列に読み込みます
  3. 読み取った文字配列でsscanfを使用して必要なデータを取得します
  4. 関連するテストを実行します
  5. 必要なものを別のファイルに出力する
  6. ファイルの最後に到達していない場合は、ポイント2に戻ります。

前の答えとは異なり、これはMatlabのスタイルではあまりありませんが、非常に大きなファイルではより効率的です。

これが役立つことを願っています。

7
Adrien

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を使用して、新しいファイルにデータを書き出します。

5
Adrian

ここに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ファイルを読み取り、各行の距離を制御して、新しいファイルに保存できます。

それが役立つことを願っています!

3
Michaël