テキストファイルにある値を区別したい

1 visualizzazione (ultimi 30 giorni)
拳志朗
拳志朗 il 22 Nov 2023
Commentato: 拳志朗 il 27 Nov 2023
N-Value P,S-Velocity Density
(m/s) (g/cm^3)
----------------------------------------------------------------------------------
1m 2 360 78 1.80
2m 13 360 78 1.68
3m 14 360 130 1.72
4m 4 360 130 1.71
5m 2 1600 130 1.68
6m 5 1600 130 1.71
7m 13 1600 130 1.88
8m 6 1600 130 1.89
9m 7 1600 130 1.90
10m 22 1600 130 1.90
11m 27 1600 200 1.89
12m 24 1600 200 1.87
13m 17 1600 200 1.87
14m 12 1600 200 1.86
15m 11 1600 200 1.85
16m 20 1600 200 1.89
17m 29 1600 200 1.90
18m 26 1600 200 1.92
19m 24 1600 200 1.82
20m 26 1600 200 1.85
これがテキストファイルにあるデータです.(This is data of text file.)
はじめに1mの上は空白になっているが深さ(depth)のヘッダー,N-Valueは N 値のヘッダー、P-Velocity (m/s)はP波速度のヘッダー、S-Velocity (m/s)はS波のヘッダー、Density (g/cm^3)は密度のヘッダー、値は深さ,N値、P波速度、S波速度、密度の値でそれらをヘッダーに合わせ一つ一つ分類したいです。
最適なコードがわからないのでご享受ください.
  2 Commenti
Dyuman Joshi
Dyuman Joshi il 22 Nov 2023
Could you please share the text file? Use the paperclip button to attach.
拳志朗
拳志朗 il 22 Nov 2023
TXT file is added.

Accedi per commentare.

Risposta accettata

Akira Agata
Akira Agata il 22 Nov 2023
添付のテキストを拝見しましたが、標準的な構成ではないためやや工夫が必要です。
手っ取り早い方法としては インポートツール を使う方法があります。
別の方法としては、readtable でとりあえずデータ部分だけを読み込んで、整形や列名の設定はプログラムでおこなうという方法があります。たとえば以下のような方法はいかがでしょうか?
% データ部分だけを読み込む
url = "https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1546487/AIC001.txt";
t = readtable(url, ...
"NumHeaderLines", 3, ...
"ReadVariableNames", false);
% 不要な列を削除
t(:,6:end) = [];
% 列名を設定
t.Properties.VariableNames = ...
{'Depth [m]', 'N-Value', 'P-Velocity [m/s]', ...
'S-Velocity [m/s]', 'Density [g/cm^3]'};
% Depth の列が文字列のため数値に変換
t.("Depth [m]") = str2double(erase(t.("Depth [m]"), 'm'));
% 可視化してみる
figure
semilogy(t.("Depth [m]"), t{:,2:end})
legend(t.Properties.VariableNames{2:end})
xlabel("Depth [m]", "FontSize", 14)
  3 Commenti
Akira Agata
Akira Agata il 26 Nov 2023
N-Value から Density までの値がない行の検出は、ismissingisnan を使うと for ループや if~else を使う必要がないため便利です。たとえば以下のようにすると、N-Value から Density までの値がない行を除去することができます(コメント頂いた「...値がない場合そのDepthの値を読み込まない」を、その行を除去することと解釈しました)。
ちなみに、以下はValue から Density まで「すべての」値がない行を除去するものです。もしValue から Density まで「いずれかの」値がない行を除去する場合は、以下コードの allany に変更して下さい。
% 欠損を含むサンプルデータ
load sample.mat
% 表示
disp(t)
Depth [m] N-Value P-Velocity [m/s] S-Velocity [m/s] Density [g/cm^3] _________ _______ ________________ ________________ ________________ 1 2 360 78 1.8 2 NaN NaN NaN NaN 3 14 360 130 1.72 4 4 360 130 1.71 5 2 1600 130 1.68 6 NaN NaN NaN NaN 7 NaN NaN NaN NaN 8 6 1600 130 1.89 9 7 1600 130 1.9 10 22 1600 130 1.9
% N-Value ~ Density に対応する 2 ~ 5 列目を確認
idx = ismissing(t(:,2:5));
% N-Value ~ Density すべてが欠損している行のインデックス
dim = 2;
idx = all(idx, dim);
% 対象の行を除去
t(idx, :) = [];
% 結果を表示
disp(t)
Depth [m] N-Value P-Velocity [m/s] S-Velocity [m/s] Density [g/cm^3] _________ _______ ________________ ________________ ________________ 1 2 360 78 1.8 3 14 360 130 1.72 4 4 360 130 1.71 5 2 1600 130 1.68 8 6 1600 130 1.89 9 7 1600 130 1.9 10 22 1600 130 1.9
拳志朗
拳志朗 il 27 Nov 2023
ありがとうございます.本当に助かりました!
また,わからないことがあったときは別のスレッドで質問を立てますので,見つけられたときはよろしくお願いします.

Accedi per commentare.

Più risposte (0)

Prodotti


Release

R2023a

Community Treasure Hunt

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

Start Hunting!