19

MATLAB で .csv ファイルを読み込もうとしています。これが私のコードです:

csvread('out2.csv')

out2.csv は次のようになります。

03/09/2013 23:55:12,129.32,129.33
03/09/2013 23:55:52,129.32,129.33
03/09/2013 23:56:02,129.32,129.33

Windowsでは、これとまったく同じファイルをxlsread関数で問題なく読み取ることができます。現在、Linux マシンを使用しています。最初に xlsread を使用してファイルを読み取ったとき、「ファイルは認識されない形式です」と言われたため、csvread の使用に切り替えました。ただし、csvread を使用すると、次のエラー メッセージが表示されます。

Error using dlmread (line 139)
Mismatch between file and format string.
Trouble reading number from file (row 1u, field 2u) ==> /09/2013
23:55:12,129.32,129.33\n

Error in csvread (line 48)
m=dlmread(filename, ',', r, c)

日付の「/」が問題を引き起こしていると思います。Windows では、1 列目が文字列として解釈されます。Linux では数字として解釈されるようで、数字を読み取ろうとしてバックスラッシュで失敗します。これは、少なくとも起こっていると私が思うことです。どんな助けでも本当にありがたいです。

4

4 に答える 4

31

csvreaddouble のみを読み取ることができるため、日付フィールドで窒息しています。を使用しtextscanます。

fid = fopen('out2.csv');
out = textscan(fid,'%s%f%f','delimiter',',');
fclose(fid);

date = datevec(out{1});
col1 = out{2};
col2 = out{3};

更新 (2017 年 8 月 31 日)

これは 2013 年に書き戻されたため、MATLAB のtextscan関数は日付と時刻を直接読み取るように更新されました。コードは次のようになります。

fid = fopen('out2.csv');
out = textscan(fid, '%{MM/dd/uu HH:mm:ss}D%f%f', 'delimiter', ',');
fclose(fid)

[date, col1, col2] = deal(out{:});

以下の@Victor Hugo(および現在、このタイプの状況に対する私の個人的な頼りになるもの)が言及している代替手段はreadtable、同じフォーマット文字列を受け入れるtextscanが、結果をテーブルオブジェクトに直接アセンブルするを使用することです。

dataTable = readtable('out2.csv', 'Format', '%{MM/dd/uu HH:mm:ss}D%f%f')
dataTable.Properties.VariableNames = {'date', 'col1', 'col2'};

dataTable =

  3×3 table

           date             col1      col2 
    ___________________    ______    ______

    03/09/2013 23:55:12    129.32    129.33
    03/09/2013 23:55:52    129.32    129.33
    03/09/2013 23:56:02    129.32    129.33
于 2013-10-27T00:11:54.650 に答える
6

残念ながら、のドキュメントcsvreadには次のように明確に記載されています。

M = csvread(filename)コンマ区切り値形式のファイルfilename. ファイルには数値のみを含めることができます。

/はカンマでも数値でもないため、エラーが発生します。

于 2013-10-27T00:08:22.487 に答える
2

readtable任意の入力を受け入れるため、 を使用できます。

https://www.mathworks.com/help/matlab/ref/readtable.html

于 2016-10-24T13:43:44.590 に答える