2016-08-03 9 views
0

X-Yデータの列から特定のX値のY値を抽出する最も堅牢な方法を知りたいと思います。TCLのX-Yテーブルから値を取得する堅牢な方法

私は現在、次のコードでこの操作を実行するが、それは

してくださいアドバイスを読んでいないか、何の変数var_01することはできませんのエラーで転倒保つようフレーク状/非常に信頼性がないのです。

反復列Z

for {set i 0} {$i < [llength $Col_z]} {incr i} { 
    set Xdata [lindex $Col_x $i] 
    set Ydata [lindex $Col_y $i] 
    lappend var $Ydata 

    if { $Xdata >= 0.9 && $Xdata <= 1.1 } { 
    set a [lindex $var $i] 

    lappend var_01 $a 
    } else {lappend var_01 0 
      #set var_01 0} 
} 

答えて

0

は、それは非常にです私たちは、リストの代わりに文字列として今$resultsを見て、強力なregexp Tclコマンドを使用します。あなたがやりたいことをうまく解決するのは難しいかもしれませんが、コードを少し簡略化することが役に立ちます:

foreach z $Col_z x $Col_x y $Col_y { 
    if {$z eq {}} { 
     break 
    } 

    if {$x >= 0.9 && $x <= 1.1} { 
     lappend var_01 $y 
    } else { 
     lappend var_01 0 
    } 
} 

コメントに従ってを編集してください:これは良いですか? xのない値が範囲内にない場合var_01が空であるかもしれないこと

set var_01 {} 
foreach z $Col_z x $Col_x y $Col_y { 
    if {$z eq {}} { 
     break 
    } 

    if {$x >= 0.9 && $x <= 1.1} { 
     lappend var_01 $y 
    } 
} 

注。

ドキュメント: && (operator)<= (operator)>= (operator)breakeq (operator)foreachiflappendset

+0

こんにちはピーター、ありがとう。これは、データの正しいセットをピックアップするときに部分的に機能します。しかし、所望のデータの前後にゼロを付加する。最後のステップは0.9&1.1と平均の間のデータを取ることです。私はJoin&llenghtを使用して平均していますが、すべてのゼロが正しい平均を取得していません。 – Anju

+0

@Anju:更新された回答。 –

+0

Peterさん、ありがとうございました。私はメッセージを送信する前にそれを試しましたが、まだゼロを続けていますが、末尾のゼロは削除されています。今すぐただ空変数を防ぐ方法を理解する必要があります – Anju

0

に基づいて、TCLのテーブルを表現するための非常に便利な方法は、単純な配列によるものです。次に例を示します。


array set xy {} 

foreach i {1 2 3} { 
    foreach j {10 20 30} { 
     set xy($i,$j) [expr $i + $j] 
    } 
} 

xyは、キーがテーブルのインデックスのように見えるの配列です。ここで:

% array names xy 
3,10 2,20 1,30 3,20 2,30 3,30 1,10 2,10 1,20 

以上クリア:


% foreach k [array names xy] {puts $k} 
3,10 
2,20 
1,30 
3,20 
2,30 
3,30 
1,10 
2,10 
1,20 

ここでは、それらにアクセスする方法を示します。

% puts $xy(3,10) 
13 

括弧内の3,10は文字列です!配列は、上記のループで関連付けられた、その文字列に関連付けられた値を返します。 (したがって、コンマの後にスペースを入れてはいけません)。

インデックスが変数に与えられている場合には、値にアクセスするのは簡単です:

% set x 3 
3 
% set y 10 
10 
% puts $x,$y 
3,10 

最後のコマンドは、明示的な引用符と同等です:

% puts "$x,$y" 
3,10 

そしてここでは、我々は、アレイにアクセスする方法でありますそのキーの要素:

% puts $xy($x,$y) 
13 

キーが存在しない場合:

% puts $xy(4,10) 
can't read "xy(4,10)": no such element in array 

のは、配列のキーと値を印刷すると結論してみましょう:


% foreach k [array names xy] {puts "$k: $xy($k)"} 
3,10: 13 
2,20: 22 
1,30: 31 
3,20: 23 
2,30: 32 
3,30: 33 
1,10: 11 
2,10: 12 
1,20: 21 

ADDED

は今、あなたはxを見つけるのですか、あなたはyz値があると?

すべての特別な、強力なtclのプロパティが文字列で使用
set y 20 
set z 23 

set results [array get xy *,$y] 

見てみましょう:

ここでは、キーパターン*,20と一致するすべてのキーと値を見つけます

puts $results 

% 2,20 22 3,20 23 1,20 21 

3組のリストがあり、それぞれにキーと値が含まれています。

今度は、アウトバー$zに対応するキー/値を抽出しましょう。

regexp "(\\d+),($y) ($z)" $results whole x1 y1 z1 

そして今x1y1z1は、私たちが望むすべての情報を保持:

puts "$x1 $y1 $z1" 

% 3 20 23 
+0

こんにちはイスラエル、例えば感謝。ここでYは既知の値です。もし私がYの値を知らなければ、与えられたXの値に対してYの値を知りたいでしょうか? – Anju

+0

@Anju、こんにちは、私はあなたが尋ねたものの例を加えました。ソリューションは非常にクールでtcl-ishです! –

関連する問題