2011-12-07 27 views
11

最初の行には変数名を、次の行には10進数のmyfile.csvがあるとします。 Matlabでは、ヘッダ行と10進数を別々に読んでみたいと思います。これまでのところ、私は、ヘッダ行を抽出するために、以下を行ってきた:Matlab:.csvファイルからのヘッダ行の読み取り

fid = fopen('myfile.csv'); 
a = textscan(fid,'%s','Delimiter','\n'); 
b = a{1,1}; 
fclose(fid); 
c = textscan(b,'%s','Delimiter',','); 
d = c{1} 

その後、私は、ファイルの数値部分を抽出するためにcsvreadコマンドを使用します。しかし、それを行う(もっと)簡単な方法があるはずです!まず、最初の行だけを抽出するためにファイル全体を読むことはしません(a = textscan(fid,'%s','Delimiter','\n');のように)。第二に、7行のコードを使用するのは間違っているように見えます。少ないコードで行えますか?

建設的な提案があれば感謝します。

+0

おかげでまた、それはこのように良く見える必要:) – skip

答えて

3

開きfopenとファイル、fscanfと小数を読み取る、textscanとヘッダ行を読み取り、最後にfcloseを呼び出す - 総:)実施例の入力ファイル内の唯一の4行:

Weight,Size,Count 
1,2,3 
4,5,6 
7,8,9 
10,11,12 

読書fscanfによって読み取られたデータは、(私はtransposeの代わりに、を書き込むことによって、このことを強調し転置する必要があること

fid = fopen('myfile.csv', 'r'); 
header = textscan(fid, '%[^,],%[^,],%[^,\r\n]', 1); 
data = transpose(fscanf(fid, '%g,%g,%g\n', [3, Inf])); 
fclose(fid); 

for i = 1 : 3; disp(['"' cell2mat(header{i}) '"']); end; 
disp(data); 

注:このファイルの)。出力:

"Weight" 
"Size" 
"Count" 
    1  2  3 
    4  5  6 
    7  8  9 
    10 11 12 
+0

おかげでたくさん!しかし、変数の数が変わるたびに書き直すことなく、異なる数の変数(3ではなく)を持つファイルに使用できるように、より普遍的な方法でコードを記述したいとしたらどうでしょうか? – skip

+1

その場合、ヘッダー行を 'getl'で読み込み、' strtok'で解析して 'nc'列の数を取得します。 'nc'が決定された後、' fscanf'の書式文字列は( '%g'をコンマで連結して)ループを使ってアセンブルされ、最後のパラメータは' [nc、Inf] 'に設定できます。 。あるいは、数値を([1 Inf]を使用して)単一の列に読み込み、後でそれを変形することもできます(行数: 'nr = length(data(:)/nc;')。 – kol

+0

徹底的な答えをありがとう! – skip

1

最初の行を抽出するためには、あなただけのライン3の

fid = fopen('myfile.csv'); 
a = textscan(fid,'%s',1); 
fclose(fid); 
関連する問題