2016-09-28 17 views
0

データポイントが多いasciiファイルにシミュレーションデータがあります。私はそれから変数名とその値を抽出しようとしています。以下のファイル形式がどのように見えるかの例です:非常に長い文字列を持つゆっくりとしたregexprep

*ESA 
*COM on Tue Sep 27 15:23:02 2016 
*COM C:\Users\vi813c\Documents\My Matlab\ 
*COM The pathname to the ESB file was: C:\Users\vi813c\Documents\My Matlab 
Case013 
*RTITLE 

Run Date/Time = 20-SEP-2016 13:29:00 
MSC.EASY5 time-history plot with  20001 data points 
*EOD 
*FLOAT 
TIME FDLB(1) FSLB(1) FVLB(1) MXLB(1) \ 
MYLB(1) MZLB(1) FDLB(2) FSLB(2) FVLB(2) \ 
MXLB(2) MYLB(2) MZLB(2) FDLB(3) FSLB(3) \ 
FVLB(3) MXLB(3) MYLB(3) MZLB(3) 
       0   884.439    -0   53645.8  -972.132 
     -311780   207.866   5403.68   1981.49   327781 
     258746 -1.74898E+006   84631.4   5384.25  -1308.47 
     326538  -97028.6 -1.74013E+006  -61858.1 
      0.002   882.616  0.008033   53661.1   -972.4 
     -311702   207.779   5400.42   1982.11   327784 
     258726 -1.74906E+006   84628.3   5381.01  -1308.44 
     326541  -97040.1 -1.74021E+006  -61858.8 
      0.004   876.819  0.031336   53705.6  -973.183 
     -311683   207.661   5391.19   1983.9   327795 
     258693 -1.74935E+006   84624   5371.85  -1309.63 
     326552  -97040.6 -1.74051E+006  -61858.8 
      0.006   869.491  0.061631   53763.3  -974.213 
     -311806   207.618   5377.45   1986.76   327813 
     258659 -1.74995E+006   84621.7   5358.2  -1312.04 
     326569  -97040.3 -1.7411E+006   -61861 
      0.008   861.718  0.095625   53828.1  -975.379 
     -312039   207.648   5360.82   1990.12   327834 

次のようなデータ形式の特性の概要は次のとおりです。

  1. すべては「* FLOAT」は、ヘッダ上であると私は取得する必要があります「* FLOAT」と最初の数値の間にそれ
  2. スタッフのRIDは、変数名
  3. 変数名と値はスペースで区切られます(複数可)と「\」
  4. ているデータは「集中」されています。各塊は、所与のシミュレーション時間ステップにおける変数の値を有する。上記の例では、19個の変数があり、各塊に19個の数値があります。
  5. 複数のデータセットがあります。 >文字の一つの大きな文字列
  6. のregexprep -

    1. がファイルをFILEREAD:それぞれが「*のFLOAT」と変数名のセクション

    私は現在、このデータを処理していますどのようにされ、次で始まります、 'で{\ '' \ n 'は\は、+ S'}' ' - によって>コンマstrsplit

  7. strfindため区切ら "* FLOAT"
  8. strsplit'、」 - >今細胞
  9. なります
  10. 最初のヌを見つけるISNANによって量体値(関数str2double(パース))2からインデックス及び4から指標間次に
  11. は変数名であり、4からインデックスと次との間に「* FLOAT」数値データである

このスキームはうまく機能しますが、これを行うためのより良い方法が必要であると考えることをやめることはできません。 1つは、ステップ1が非常に遅いことです。私はregexprepが複数のものを置き換えて作業するための大きな文字列だと思います。

スクリプトを改善するにはどうすればよいですか?

+1

'textscan'や、' regexp'ではなく、ファイルを解析するために作られたものは、巨大な文字列に対して遅くなるため、なぜ使用しないのですか? – Suever

答えて

0

私は16bの新機能である文字列クラスを使ってこれを撮影しました。

str = string(fileread('file.txt')); 

fileNewline = [13 newline]; % This data has carriage returns 

str = extractAfter(str, ['*FLOAT' fileNewline]); 
str = erase(str, ['\' fileNewline]); 
str = splitlines(str); 

% Get the variable names 
varNames = split(str(1))'; 

% Get the data 
data = reshape(str(2:end), 4, [])'; 
data = strip(data); 
data = join(data); 
data = split(data); 
data = double(data); 

ファイルの読み込み方法がわかりません。

もう1つのコメントで述べたように、textscanが役に立ちます。最速のソリューションになる可能性があります。正しいフォーマットが指定され、 'HeaderLines'オプションを使用することで、動作させることができると思います。

関連する問題