csvファイル読み込​み時のreadtab​leのエラー

14 vues (au cours des 30 derniers jours)
HIronori Kamachi
HIronori Kamachi le 22 Déc 2020
.csvファイルの読み込みにreadtableを使用しているのですが、以下のエラーが出ます。
エラー: readtable (line 223)
複製係数は整数の行ベクトルまたは整数スカラーでなければなりません。
メモ: readtable で次のパラメーターが検出されました。
'Delimiter', ',', 'HeaderLines', 0, 'Format', '%*s'
エラー: SoftSensor_pre201210 (line 449)
querycsv = readtable('query.csv','ReadVariableNames',false);
理由がよくわかりません。何か解決策はないでしょうか。
  6 commentaires
Kojiro Saito
Kojiro Saito le 24 Déc 2020
上記のコードでは、fcloseでリターンが0以上の場合にしか次のreadtableに移れないので、ファイルクローズは問題ないように思えます。query.csvへのfprintfでの書き込みのほうでの原因は考えられないでしょうか?
HIronori Kamachi
HIronori Kamachi le 24 Déc 2020
ご教示いただきありがとうございます。
書き込みのほうについてはあまり考えていませんでした。もう一つのプログラムの方では書き込みには単純に
writetable(Query0(i_query,:),'query.csv','WriteVariableNames',false);
で、対応するquery.csvの中身をquery.csvに書き出しているだけなのですが...
数百回繰り返す間に起こることもあり、数千回繰り返して起こることもあり、よくわかりません。

Connectez-vous pour commenter.

Réponses (1)

Kojiro Saito
Kojiro Saito le 24 Déc 2020
私のほうでは再現できていないのですが、readtableをtry/catchで囲んで、読み取り発生時は再度readtableを実施するようにしてみてはいかがでしょうか。
以下がサンプルですが、while文でreadtableを繰り返し、正常に読み込めたらwhile文を抜けるというものです。
stat = false;
while stat ~= true
try
querycsv = readtable('query.csv','ReadVariableNames',false);
stat = true;
disp('読み込み完了')
catch ME
disp(ME.message)
disp('読み込みをリトライします')
end
end
  1 commentaire
HIronori Kamachi
HIronori Kamachi le 5 Jan 2021
ご教示いただきありがとうございます。
頂いたアイデアを基に、まずは動作確認のために同様な動作をするような書き込みモデル(writetest.m)と読み込みモデル(readtest.m)を作成し、同一フォルダ中にnmax.csv(Query0.csvの列を何列並べてtestquery.csvを書き出すかを規定)とQuery0.csvを置き、writetest.mでtestquery.csvを書き出し、readtest.mでtestquery.csvを読み込む動きを再現しました。(以下、読み込み改良部分のコードです)
stat = false ;
while stat ~= true
try
fileID=-1;
 while fileID<0
  fileID=fopen('testquery.csv','rt');
 end
 status=-1;
 while status<0
  status=fclose(fileID);
 end
 qcc=0;
  qn=256*nmax;
while qcc<qn %
querycsv = readtable('testquery.csv','ReadVariableNames',false);
[qcr,qcc]=size(querycsv);
end
% pause(0.5);
stat = true ;
disp('読み込み完了 ')
catch ME
disp(ME.message )
disp('読み込みをリトライします ')
retry=retry+1;
pause(0.5);
end
end
nmaxを例えば10にして試すと、結構な頻度(50回に1回ぐらい)で読み込みできないエラーが発生しますが、リトライして正常に読み込みできるようになりました。リトライの方にのみpauseを入れているのは、エラーが発生した時だけpauseを入れて待ち時間を設けるが、正常読み込みの場合は待ちを省いてなるべく時間を短縮するようにしました。
これで一応解決はしたようなのですが、根本的な解決法は無いものでしょうか。

Connectez-vous pour commenter.

Catégories

En savoir plus sur 起動と終了 dans Help Center et File Exchange

Produits


Version

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!