大容量のテキストファイルをMATLABに読み込む方法

 

最近はPCスペックが向上し、FEMソフトなどで大容量のモデルを扱えるため、その解析結果が100GB以上になってしまう場合があります。そのような大容量の解析結果(テキスト形式)はメモ帳や秀丸エディタ、Terapad、サクラエディタでは開けません。もちろんMATLABでも読めません。

そもそも解析結果には解析ソフト特有のヘッダーなどがついているため、”readmatrix”などのファイルから行列を読み込むfunctionファイルがうまく機能しない場合があります。

これらの問題を容易に解決する方法についてまとめたいと思います。

Windows PowerShellでの解析結果の確認方法

ここではFEMソフトのNastranの解析結果である.pchファイルを例に説明します。
大容量の解析結果の中身を確認する方法は下記の3つの手順です。

①Windows PowerShellを開く


②ファイルが保存されているディレクトリに移動

cd("ディレクトリ先")

③シェル上で下記のコマンドを実行する

Get-Content -Path test2.pch -TotalCount 10

すると、下図のように赤枠の部分に「test2.pch」の10行までが表示されます。
上のコマンドのファイル名や「-TotalCount 10」の数値は各自で設定ください。

Windows PowerShellでの解析結果の分割方法

大容量だと読み込めないので、解析結果を分割します。
分割するコマンドは下記です。

 $i=0; cat test2.pch -ReadCount 10000 | % { $_> cut_test$i.txt;$i++}

ここでは、10000行ごとにcut_test0.txt~cut_testN.txtまでのファイルが作成されます。
Nはtest2.pchの行数によります。例えば、test2.pchが30500行であれば、下記のようになります。
cut_test0.txtは10000行のファイル
cut_test1.txtは10000行のファイル
cut_test2.txtは10000行のファイル
cut_test3.txtは500行のファイル

後でMATLABで読み込むことを考えると解析ケースなどの数に合わせておくのが良いと思います。
例えば、Nastranの固有値解析だと固有値ごとに節点の数の結果が出ます。
周波数応答解析だと解析周波数ごとに節点数の数の結果が出力されます。(sort2という出力方法)
ここらへんは各自で解析ソフトの出力形式をご確認ください。

分割したファイルの確認

分割したファイルがフォルダ内に生成されているのが下図からわかりますね。

大容量の解析結果特有の問題点

Nastranの解析結果の特徴として、各行の最後に行数番号が印字されます。
解析結果のファイル容量が大きい場合、その行数番号が解析値の「0.000000E+00」とつながってしまい、MATLABで読み込みにくくなるという問題が生じます。

Windows PowerShellでの文字列数を指定したファイル生成

下図のように赤枠の部分だけのテキストファイルになればよいことになります。
つまり、テキストファイルの列数を指定して、指定した列数以上は削除したテキストファイルに変換できれば良いことになります。

このような処理をするWindows PowerShellのコマンドは下記です。
今回は読み込んだテキストファイルを72列以下だけを出力することになります。

for ( $i=0 ; $i -le 100 ; $i++ )
{
Get-Content cut_test$i.txt | %{ $_.Substring(0,72) } | Set-Content cut2_test$i.txt
}

 

この処理をしたファイルを確認してみましょう。

72列以上は削除された形のテキストファイルが作成できていますね。

MATLABのreadmatrixでヘッダーを無視する方法

ここではあくまで一例として説明したいと思います。
ヘッダーつきのテキストファイルをMATLABのreadmatrixで読み込むと、データの読み込みがうまくいきません。そのため、テキストファイルのヘッダーを削除するか、ヘッダーを無視した読み込み方法を検討する必要があります。

テキストファイルを数個だけ読み込むのであれば、手作業でヘッダーを削除するのでも良いと思います。しかし、数十~数千個のファイルを読み込む場合は手作業では対応できません。

そこで、ヘッダーを無視して読み込む方法を調べてみたら、意外と簡単にできることがわかったので、備忘録のために記載しておきます。下記のようにreadmatrixで’Range’をしていすると、指定した行数から読み込みすることができます。今回は上図のヘッダーを無視したいので、8行目から読み込んでいます。

data=readmatrix('cut2_test2.txt','Range',8)

 

このように、大容量の解析結果であっても適切な処理をすればMATLABに読み込むことができます。

コメント