2017-12-04 12 views
2

MATLABからC#ソフトウェアにデータを転送する必要があります。 MATLABからのデータも、オフラインで編集可能(MATLAB外およびC#ソフトウェア)である必要があります。これを達成するために、私のMATLABコードは、読み取り可能なパターンのデータをテキストファイルに出力します。たとえば:C#ので文字列からキーワードを抽出し、C#のプロパティに割り当てます。

<L> pt: [0.001,2,3], spd: 100, cfg: fut, daq: on, id: [1,1] </L> 
<L> pt: [0.002,3,4], cfg: nut, spd: 100, id: [1,1], daq: on</L> 
<C> pt: [0.02,5,3], spd: 100, daq: on, id: [1,1] </C> 
<L> pt: [1.002,3,4], spd: 100, daq: off</L> 

が、私は、それぞれの行を解析し、これらのキーワードを抽出し、プロパティに割り当てたい:

enum PathType { L, C} 
class Path 
{ 
    public PathType Type { get; set; } 
    public float[] Pt { get; set; } 
    public int Spd { get; set; } 
    public string Cfg { get; set; } 
    public bool Daq { get; set; } 
    public int[] Id { get; set; } 
} 

だから、1行目のために、私は何かを持っているつもりのようになります。 4行目のため

var path = new Path { 
    PathType = PathType.L, 
    Pt = new []{ 0.001, 2, 3 }, 
    Spd = 100, 
    Cfg = "fut", 
    Daq = true, 
    Id = new []{ 1, 1 }}; 

var path = new Path { 
    PathType = PathType.L, 
    Pt = new []{ 1.002, 3, 4 }, 
    Spd = 100, 
    Cfg = null, 
    Daq = false, 
    Id = null; 

キーワードは異なる順序で配置され、すべての行に表示されない場合があるため、これらの情報を抽出するために単一の正規表現を使用することはできません。

var typeReg = new Regex(@"<(\w+)>"); 
    var ptReg = new Regex(@"pt:\s+(?<open>\[)[^\[]*(?<close-open>\])(?(open))"); 
    var spdReg = new Regex(@"spd:\s+(\d+)"); 
    var cfgReg = new Regex(@"cfg:\s+(fut|nut)"); 
    var daqReg = new Regex(@"daq:\s+(on|off)"); 
    var idReg = new Regex(@"id:\s+(?<open>\[)[^\[]*(?<close-open>\])(?(open))"); 

これは動作しますが、これを行うにはもっと良い方法があるのでしょうか?

L; pt: [0.001,2,3]; spd: 100; cfg: fut; daq: on; id: [1,1] 

そしてIはデリミタ;で文字列を分割した後x.StartWith('...')で各部分を確認することができる:

は私のような異なるパターンのデータを印刷しなければなりません。しかし、このように、私は現在のパターンほど読みにくいと感じています。

xmlを使用したくないのは、テキストファイルを希望のサイズより大きくするためです。

+3

MATLABはこれらの文字列を作成しています。解析しているファイルを生成している場合は、ファイルサイズが気になる場合はXMLの代わりにJSONを使用します。 MATLABがそれらを生成している場合は、あなたが言ったように分割された文字列を解析する必要があります。 – krillgar

+0

現在のフォームのデータファイルのサイズはどれくらいですか?オブジェクトのサイズと数の点で。 –

+0

@krillgar文字列を作成するコードをMATLABで作成しました。私はいつも私のC#コードに合うようにそれらを変更することができます。 JSONは良いと思います。私はそれを試してみましょう。 – Anthony

答えて

2

私はJSONとXMLを比較して、XMLが優れていることを発見しました。 XMLフォーマットの理解が不十分で、ファイルサイズが大幅に増えると思っていましたが、これは間違っています。


JSONの実装

この方法は、Newtonsoft.Json NuGetパッケージが必要です。それを必要としない他のsolutionsもあります。

MATLAB出力:

using Newtonsoft.Json; 
public void Dictionary<string,string> DecodeJson(script) 
{ 
    return JsonConvert.DeserializeObject(script); 
} 

返されたオブジェクトは、辞書は属性名で構成され、すなわちタイプ、PT、SPD等である:JSONを復号する

{"type":"L", "pt": "[0.001,2,3]", "spd": "100", "cfg": "fut", "daq": "on", "id": "[1,1]"} 

C#コードは、のように単純ですキーと属性値として値として使用します。

サンプル出力の100kのデコードには約330msが必要です。


XML実装

MATLAB出力:

<L pt='[0.001,2,3]' spd='100' cfg='fut' daq='on' id='[1,1]' /> 

C#コード:

public void Dictionary<string,string> DecodeXml(script) 
{  
    var xmlObj = new Dictionary<string, string>(); 
    using (var reader = XmlReader.Create(new StringReader(script))) 
    { 
     reader.Read(); 
     // add node name, i.e. xmlObj["type"] -> L 
     xmlObj.Add("type",reader.Name); 
     // add all attributes 
     while (reader.MoveToNextAttribute()) 
     { 
      xmlObj.Add(reader.Name, reader.Value); 
     } 
    } 
    return xmlObj; 
} 

この方法JSON法と同じオブジェクトを返します。

デコード例出力のデコード100kには約180msが必要です。


結論

XMLの実装のための入力文字列がJSONの実装、従って小さいファイルサイズよりも短いです。 XMLコードの実行時間は、JSONコードの実行時間の約2倍です。したがって、XMLがより良い選択です。

関連する問題