読み込めるファイルと読み込めないファイルの違い

14 views (last 30 days)
拳志朗
拳志朗 on 8 Feb 2024
Commented: 拳志朗 on 8 Feb 2024
以下のコードを用いて添付のファイルを読み込むとY001.txtは読み込めるのですが,Y002.txtでは次の太字で示したエラーメッセージが出ます.ファイルは同じ形式なので改善方法が思いつきません.どのようにすれば改善できるでしょうか?
Y002.txt
次を使用中のエラー: {}
データ型が double と cell であるため、table 変数 'Depth[m]' および 'Density[Mg/m^3]' を連結できません。
エラー: table2array (行 37)
a = t{:,:};
エラー: ppp (行 32)
D = table2array(t);
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
%対象のファイル範囲
start_index = 1;
end_index = 2;
%ファイルのベースネーム
base_name = 'Y';
%ファイルの拡張子
file_ext = '.txt';
for i = start_index:end_index
%ファイル名を生成
Fname = [base_name, num2str(i,'%03d'),file_ext];
%ファイルの内容を読み込む
load = fileread(Fname);
%テキストの内容を読み込むか読み込まないかの判別
if ~contains(load, 'Sorry, We have no soil condition data.')
%ファイルの読み込み処理をここに追加
disp(Fname);
%データの読み込み
%Delimiterが半角スペースであることを明示的に指定
%半角スペースの連続は1つのDelimiterとして扱う
t = readtable(Fname,"NumHeaderLines", 3, "ReadVariableNames", false, "Delimiter", " ", "ConsecutiveDelimitersRule", "join");
%不要な部分を削除
t (:,[1 7:end]) = [];
%ヘッダーの名前を決定
t.Properties.VariableNames = {'Depth[m]', 'N-Value', 'P-Velocity[m/s]', 'S-Velocity[m/s]', 'Density[Mg/m^3]'};
t.("Depth[m]") = str2double(erase(t.("Depth[m]"),'m'));
D = table2array(t);
%データの表示
disp(t)
data_cell_array{i} = D;
else
disp(['Skipped file: ' Fname]);
end
end
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Accepted Answer

Kenjiro Sugimoto
Kenjiro Sugimoto on 8 Feb 2024
Edited: Kenjiro Sugimoto on 8 Feb 2024
"Y001.txt""Y002.txt"において「Density列が全て埋まっているか否か?」がポイントです。"Y001.txt"ではDensity列 が正しくdouble型として解釈されています。"Y002.txt"では Density列 が一部しか記述されていないために右隣の Soil Column列 が Density列 にずれ込んだ形で読み込まれており、そのずれ込んだ項目に文字が含まれているために Density列 がdouble型配列ではなくcharセル配列型と解釈されています。これらの型のミスマッチがエラーの直接的な意味です。
改善策ですが、テキストファイルのフォーマットを変えてよいのであれば、コンマ区切り形式としてデリミタを","とするのはいかがでしょうか。現状のようにスペースをデリミタとして連続するスペースをまとめて一つと解釈する形ですと、ファイル上で空欄を表現できないという問題が生じてしまいます。あるいは空欄として NaN と書いておくという手もアリかもしれません。
  3 Comments
Kenjiro Sugimoto
Kenjiro Sugimoto on 8 Feb 2024
readtable()での読み込み時に形が崩れていますので、readtable()でのデリミタ設定を "," にする必要があります。もちろん、テキストファイルもその形に合わせて書き換える必要があります。
% 現状: デリミタがスペース、連続するデリミタは統合、という設定になっている
t = readtable(Fname,"NumHeaderLines", 3, "ReadVariableNames", false, "Delimiter", " ", "ConsecutiveDelimitersRule", "join");
% 改善案: デリミタをカンマ、連続するカンマは統合しない、という設定
t = readtable(Fname,"NumHeaderLines", 3, "ReadVariableNames", false, "Delimiter", ",");
テキストファイルの書式を変更できないとなると別の方法を考える必要があります。
拳志朗
拳志朗 on 8 Feb 2024
解決できました.ありがとうございます.
最終的に読み込むファイル数が500程度なので書き換えは出来そうです.

Sign in to comment.

More Answers (0)

Categories

Find more on データ型の変換 in Help Center and File Exchange

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!