Borrar filtros
Borrar filtros

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

12 visualizaciones (últimos 30 días)
Tomoyasu KAMIYA
Tomoyasu KAMIYA el 16 de En. de 2023
Comentada: Atsushi Ueno el 16 de En. de 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ケタの数値(点の座標)を配列に格納する、
ということをやりたいです。
以上よろしくお願いいたします。

Respuesta aceptada

交感神経優位なあかべぇ
交感神経優位なあかべぇ el 16 de En. de 2023
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 comentario
Atsushi Ueno
Atsushi Ueno el 16 de En. de 2023
>現在も欠損値を持った固定幅のデータを読み込む機能はないでしょうか。
固定長データ専用の方法があります。しかしながら、GRIDで始まる行を選び出す用途には先の回答(正規表現)の方が適しているのではないかと思います。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre データのインポートとエクスポート en Help Center y File Exchange.

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!