2016-08-07 23 views
0

で文字列内の単語を検索:私はこの文字列を持っているTCL

1、RotD50、88、0.1582、1.2264、 - 、7.4、23.6、0.2、 "サンフェルナンド"、1971年、「サンタFelitaをダム(アウトレット)」、6.61、リバース、24.69、24.87、389.0、0.125、1.2939、RSN88_SFERN_FSD172.AT2、RSN88_SFERN_FSD262.AT2、RSN88_SFERN_FSD-UP.AT2

私はRSN88_SFERN_FSD172.AT2RSN88_SFERN_FSD262.AT2

のインデックスを見つけたいです

私はいくつかのスクリプトを試しましたが(次のような)、私は見たいです誰かが厳格なスクリプトで私を助けることができますか?

set currentdirc [pwd] 
set fp [open _SearchResults.csv] 
set count 1 

foreach line [split [read $fp] \n] { 
    foreach word [split $line] { 
     set word [string trim $word ","] 
     set index [lsearch -exact $word "Horizontal-1 Acc.Filename"] 
     puts "$index" 
    } 
} 
+0

、あなたが実際に動作するものやパフォーマンスの面でよりよいものを意味しますか?私はあなたのスクリプトからいくつかの欠点を見つけることができますが、あなたが探しているものを正確に言うのは難しいです。 – Jerry

+0

こんにちはジェリー!このコードは、私が望むように実際には動作しません。私は上に紹介した行に "Horizo​​ntal-1 Acc.Filename"のインデックスを取得したいと思います。それは私がコードから欲しいものです!助けてくれてありがとう ! – Reza

答えて

0

あなたはcsvファイルを扱っているので、私はこの作業を行うためにcsvパッケージを使用します。

1, 
RotD50, 
88, 
0.1582, 
1.2264, 
-, 
7.4, 
23.6, 
0.2, 
"San 
Fernando" 

だから私の提案は次のとおりです:盲目的例(自分のライン上の各要素)のために、へ1, RotD50, 88, 0.1582, 1.2264, -, 7.4, 23.6, 0.2, "San Fernando"物事を分割します分割

set currentdirc [pwd] 
set fp [open [file join $currentdirc _SearchResults.csv] r] 

package require csv 
foreach line [split [read $fp] \n] { 
    set words [::csv::split $line] 
    set index [lsearch -exact $words "Horizontal-1 Acc.Filename"] 
    puts $index 
} 

また、単語のリストは、全体のラインです。したがって、単語をループしたい場合は、代わりにif {$word eq "Horizontal-1 Acc.Filename"}を実行し、インデックスを追跡するためにcount(私の提案で削除したもの)を使用する必要があります。

あなたはCSV形式のパッケージを使用することはできません何らかの理由で、あなたの代わりに::csv::splitを含む行の、これを使用して試すことができた場合:

set all [regexp -all -inline -- {\"[^\"]+\"|[^,]+} $line] 
set words [lmap w $all {set w [string trim $w {\" }]}] 

(私は唯一の適切な構文のために引用符のため\"を使用しています

package require csv 

として:強調し、あなたは安全に

1

あなたはこれを必要としている)だけで"を使用することができます前に、データを行に分割し、それらの行を反復処理します。前または後の空白行を避けるために、まずデータをトリムします。

foreach line [split [string trim [read $fp]] \n] { 

代わりのTcllibでcsvパッケージから専用のコマンド::csv::splitを使用し、splitコマンドを使用してCSVデータを分割しようとしています。おそらくTclのインストールで既にそれを持っているでしょう。

行を分割すると、多くのデータフィールドの周囲に不要な空白があります。それを整えましょう。

set words [lmap word $words {string trim $word}] 

最後に、単語のリスト内のデータを検索できます。あなたがしたように各単語を検索するのは無意味です。

set index [lsearch $words RSN88_SFERN_FSD262.AT2] 

一緒にそれを置く:

foreach line [split [string trim [read $fp]] \n] { 
    set words [::csv::split $line] 
    set words [lmap word $words {string trim $word}] 
    set index [lsearch $words RSN88_SFERN_FSD262.AT2] 
    puts $index 
} 

ドキュメント: csv (package)foreachlmap (for Tcl 8.5)lmaplsearchpackageputsreadsetsplit、「厳しい」によって string

関連する問題