固定長フィールドのテ​キストファイルを読み​込むにはどのような処​理をすればよいですか​?

14 views (last 30 days)
Tomoyasu KAMIYA
Tomoyasu KAMIYA on 16 Jan 2023
Commented: Atsushi Ueno on 16 Jan 2023
8ケタのフィールドをもつテキストデータ(具体的に言うとNASTRANのバルクデータ)を
MATLABに読み込もうとしています。
例えば以下のような感じです。
$$------------------------------------------------------------------------------$
$$ Bulk Data Cards $
$$------------------------------------------------------------------------------$
BEGIN BULK
$$
$---1---/---2---/---3---/---4---/---5---/---6---/---7---/---8---/---9---
GRID 1000001 1425.013454.42021802.587
GRID 1000002 1413.27453.2196 1835.44
GRID 1000003 1413.284451.9704 1835.4
GRID 1000004 1425.013 -454.421802.587
$$------------------------------------------------------------------------------$
CTETRA 1685325 90 1099754 1114868 1114873 1114870 2195015 1428779+
+ 1945241 2195016 1428776 2195014
CTETRA 1685326 90 1114988 1099757 1098925 1114868 1986101 1349530+
+ 1476030 1986156 2195005 2195013
CTETRA 1685327 90 1101590 1099758 1099754 1114870 1349529 1940311+
+ 1940310 1581630 2195004 2195016
$$------------------------------------------------------------------------------$
CBUSH 2984050 3 2340912 2821251 0
CBUSH 2984051 3 2821196 2821252 0
区切り文字は無く、たとえば7行目で言うと、
はじめの8ケタ:GRID
2番目の8ケタ:1000001
3番目の8ケタ:空欄
4番目の8ケタ:1425.013
5番目の8ケタ:454.4202
6番目の8ケタ:1802.587
というデータがそれぞれ格納されています。なお$で始まる行はコメント行なので無視したいです。
このようなデータを読み込むにはどのような処理をすればよろしいでしょうか。
12年くらい前の質問で似たようなもの(下記リンク)があったのですが、現在も欠損値を持った固定幅のデータを読み込む機能はないでしょうか。
ちなみに、読み込んだ後やりたい処理は、
ファイル全体(130万行程度)の中から、GRIDで始まる行を選び出し、
2番目の8ケタの数値(=点の識別番号)と4~6番目の8ケタの数値(点の座標)を配列に格納する、
ということをやりたいです。
以上よろしくお願いいたします。

Accepted Answer

交感神経優位なあかべぇ
regexpを使用して、GRIDから始まる行の識別番号と座標データを抜き出し、数値変換しました。
fileID = fopen('textData.txt');
str = fscanf(fileID, '%c')
str =
'$$------------------------------------------------------------------------------$ $$ Bulk Data Cards $ $$------------------------------------------------------------------------------$ BEGIN BULK $$ $---1---/---2---/---3---/---4---/---5---/---6---/---7---/---8---/---9--- GRID 1000001 1425.013454.42021802.587 GRID 1000002 1413.27453.2196 1835.44 GRID 1000003 1413.284451.9704 1835.4 GRID 1000004 1425.013 -454.421802.587 $$------------------------------------------------------------------------------$ CTETRA 1685325 90 1099754 1114868 1114873 1114870 2195015 1428779+ + 1945241 2195016 1428776 2195014 CTETRA 1685326 90 1114988 1099757 1098925 1114868 1986101 1349530+ + 1476030 1986156 2195005 2195013 CTETRA 1685327 90 1101590 1099758 1099754 1114870 1349529 1940311+ + 1940310 1581630 2195004 2195016 $$------------------------------------------------------------------------------$ CBUSH 2984050 3 2340912 2821251 0 CBUSH 2984051 3 2821196 2821252 0 '
fclose(fileID);
gridData = regexp(str, '\nGRID (.{8}).{8}(.{8})(.{8})(.{8})', 'tokens'); % 改行 GRIDから始まる行のデータの抽出
gridData = vertcat(gridData{:});
gridData = cellfun(@(x) str2double(x), gridData)% 1列目 識別番号 2-4列目 座標データ
gridData = 4×4
1.0e+06 * 1.0000 0.0014 0.0005 0.0018 1.0000 0.0014 0.0005 0.0018 1.0000 0.0014 0.0005 0.0018 1.0000 0.0014 -0.0005 0.0018
  1 Comment
Atsushi Ueno
Atsushi Ueno on 16 Jan 2023
>現在も欠損値を持った固定幅のデータを読み込む機能はないでしょうか。
固定長データ専用の方法があります。しかしながら、GRIDで始まる行を選び出す用途には先の回答(正規表現)の方が適しているのではないかと思います。

Sign in to comment.

More Answers (0)

Categories

Find more on データのインポートとエクスポート in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!