2012-03-12 6 views
0

次のような2つの異なるキーと値のペアパターンを持つプロパティファイルがあります。AS3 - 特定のキーパターンに一致するプロパティファイルからすべての値を読み込みます。

  1. name.name.name.key =値
  2. name.name.fullname.keyキーが知られている場合=値

それらを一つ一つへのアクセスは問題ありません。 私が今必要とするのは、キー(正確には整数)を知らなくても、name.name.nameという名前のすべての値にアクセスすることです。値はリストに表示するためにArrayListに追加する必要があります。

キーは完全にランダムなので、事前に範囲を知ることはできません(各プロパティファイルのキーの範囲の範囲をハードコーディングしたくないし、そうしたくない)ので、以前の私がここで必要とするものではありません。また、キーは連続していません。

AS3でどうすればいいですか?

これはちょっと分かりにくいようです。 プロパティファイルを解析しません。むしろASとFlexがすでに提供している方法を使ってこれを解決したいと思っています。 ResourceBundleクラスには、指定されたバンドルの内容を出力するメソッドがすでに用意されています。ただし、すべての値が含まれています。私が必要とするのは、特定のキーパターンに一致する値のサブセットです。

編集: これを簡単にするために、キーパターンマッチングを削除して、異なるパターンの新しいリソースファイルを作成することができます。今は、そのリソースからすべてのキーと値のペア(キーと値の両方の整数が必要)だけを取得する必要があります。ここ

+0

ここに必要な情報を正確に伝えるのは難しいです。それぞれのキーに値のリストがあるディクショナリになる文字列解析メソッドを作成しようとしていますか?あるいは、各キーには1つの値がありますか? – Ocelot20

+0

非常に広範で、リアルタイムで解析するには時間がかかりすぎるため、プロパティファイル全体の解析は避けたいと思います。 ResourceManagerは、指定されたプロパティファイルからキーと値のペアを取得するために、この問題を解決する方法です。各キーは実際には1つの値しか持っていません。キーが特定のパターンと一致するプロパティファイルからDictを取得することは、実際には理想的です。それは私が後にしていることとほぼ同じですが、残念ながらResourceManagerはそのようなメソッドを提供していないようですか? – AlBirdie

答えて

2

は、文字列解析と単純な例である:パッケージによって提供される方法をフォーマットするように適合ストリング

import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.events.Event; 

var l:URLLoader = new URLLoader(new URLRequest("inp.txt")); 
l.addEventListener(Event.COMPLETE, onComplete); 


function onComplete(e:Event):void 
{ 
    var data:String = e.target.data; 
     //remove whitespace 
    data = data.replace(' ',''); 
     //split data string by lines 
    var pairs:Array = data.split("\r\n"); 
     //our name search pattern 
    var pattern:RegExp = /name\.name\.name/; 
     //array to store extracted values 
    var values:Array = []; 
    for each (var s:String in pairs) { 
     if (pattern.test(s)) { 
      //we've got a match, let's extract value 
      var value:String = s.split("=")[1]; 
      values.push(value); 
     } 
    } 
} 
+0

乾杯、残念ながら私が探しているものではありません。私は既にキーと値のペアを持つプロパティファイルを持っています。簡単にするために、キーパターンを削除し、このパターンに合ったペアを別のリソースに入れて、すべてのキーと値のペアを取得するタスクを残します1回の呼び出しでリソースから削除します。 – AlBirdie

+0

まあ、誰もResourceManagerでこれを解決する方法を知っているようだから、私は文字列の解析に固執します。しかし、ループ内のString.splitは、分割された値の最初の値ではなく、最初の行の値だけを返します。 – AlBirdie

+1

ResourceBundleをサブクラス化し、提供するパターンに基づいてすべてのキーと値を抽出するメソッドを作成することで、ResourceManagerを使って解決できます。あるいは、実際のコードが必要ですか?文字列解析ソリューションに関して、私はもう一度それをテストし、パターンに一致するすべての値を取得しました。私のコードの具体的な実装を確実に共有することはできますか? – package

0

function onComplete(e:Event):void 
{   
    var data:String = e.target.data; 
    var pairs:Array = data.split("\r\n"); 

    var values:Array = []; 
    for each (var s:String in pairs) {  
     var value:String = s.split("=")[1]; 
     values.push(value); 

    } 
    trace(values); 

} 

理由はわかりませんが、トレースでは最初のペアと第2ペアのキーの値がわかります。 理由がわかりません。

私は実際には、キーと値をディクショナリに追加していますが、この行を囲んでいます。

_dict[arr[0].substr(0, arr[0].length)] = arr[1]; 
+1

'ペア 'のトレースを試みましたか?私は何かが分裂に間違っていると思う。 "\ r \ n"部分は自分の環境に適しているかもしれませんが、mac/linuxでは違うかもしれません。 – package

+0

ペアだけでなくs(実際の行)は完全にうまくいきます。そのため、スプリットが正しく動作しないのが不思議です。編集:待って、実際にはない!私は最初の行と残りの部分との間に分割を得る!ヘッドアップをありがとう!それに取り組んで! – AlBirdie

+0

問題が解決しました。\ nは期待どおりに動作します。基本的には、サブクラス化されたResourceManagerクラスで同じことをするので、私はあなたの答えを受け入れるように設定します。あなたの助けてくれてありがとう! – AlBirdie

関連する問題