1

csvMATLABで次のファイルを読み取る必要があります。

2009-04-29 01:01:42.000;16271.1;16271.1
2009-04-29 02:01:42.000;2.5;16273.6
2009-04-29 03:01:42.000;2.599609;16276.2
2009-04-29 04:01:42.000;2.5;16278.7
...


タイムスタンプ;値1;値2 の3つの列が必要です

ここで説明するアプローチを試しました:
MATLAB で CSV ファイルから日付と時刻を読み取る
:

filename = 'prova.csv';  
fid = fopen(filename, 'rt');  
a = textscan(fid, '%s %f %f', ...  
        'Delimiter',';', 'CollectOutput',1);  
fclose(fid);

a{1}='ÿþ2'しかし、最初の要素がで、もう一方が空で ある 1x2 セルを返します。

また、これらの質問に対する答えを自分のケースに適応させようとしました:
MATLAB で時間とともにデータをインポートする
matlab で特定の形式のデータ ファイルを読み取り、日付をシリアル時刻に変換します
が、成功しませんでした。

csvそのファイルをインポートするにはどうすればよいですか?

編集@macduffの回答の後、上記で報告されたデータを新しいファイルにコピーして貼り付けようとし、次を使用します。

a = textscan(fid, '%s %f %f','Delimiter',';');  

そしてそれは動作します。csv残念ながら、MATLAB の奇妙な動作の原因と思われる、自動的に生成されたファイルを処理する必要があるため、問題は解決しませんでした。

4

3 に答える 3

0

試してみるのはどうですか:

a = textscan(fid, '%s %f %f','Delimiter',';');

私にとっては、次のようになります。

a = 

{4x1 cell}    [4x1 double]    [4x1 double]

したがって、 の各要素はacsv ファイルの列に対応します。これはあなたが必要とするものですか?

ありがとう!

于 2012-09-13T16:44:36.517 に答える
0

このような大きなファイルを解析する必要がありましたが、この仕事には textscan が気に入らないことがわかりました。基本的な while ループを使用してファイルを解析し、datevec を使用してタイムスタンプ コンポーネントを 6 要素の時間ベクトルに抽出します。

%% Optional: initialize for speed if you have large files
n = 1000  %% <# of rows in file - if known>
timestamp = zeros(n,6);
value1 = zeros(n,1);
value2 = zeros(n,1);

fid = fopen(fname, 'rt');
if fid < 0
    error('Error opening file %s\n', fname); % exit point
end

cntr = 0
while true
    tline = fgetl(fid);  %% get one line
    if ~ischar(tline), break; end; % break out of loop at end of file
    cntr = cntr + 1;

    splitLine = strsplit(tline, ';');  %% split the line on ; delimiters
    timestamp(cntr,:) = datevec(splitLine{1}, 'yyyy-mm-dd HH:MM:SS.FFF'); %% using datevec to parse time gives you a standard timestamp vector
    value1(cntr) = splitLine{2};
    value2(cntr) = splitLine{3};
 end

%% Concatenate at the end if you like
result = [timestamp  value1  value2];
于 2015-11-08T04:51:11.880 に答える
0

あなたはそれについて正しい方法で進んでいるようです。あなたが提供する例はここでは問題ありません。あなたが望む出力が得られます。1x2 セルには何が入っていますか?

私があなただったら、ファイルの小さなサブセット (たとえば 10 行) で再試行し、出力が変わるかどうかを確認します。はいの場合は、4x1 セル + 4x2 配列が 1x2 セルに分割される場所が見つかるまで、100 行などを試してください。空の行または単一の空のフィールドなどがある可能性がありtextscan、追加レベルのセルでデータを収集する必要があります。

最後の 2 つの列を 1 つの配列に収集することに注意してください。その'CollectOutput',1ため、文字列を含む 4x1 のセル配列が 1 つと、倍精度を含む 4x2 の配列が 1 つになることに注意してください。それは本当にあなたが望むものですか?それ以外の場合は、@macduff の投稿を参照してください。

于 2012-09-13T17:36:23.333 に答える