在TCL

2016-08-07 35 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 {\" }]}] 

(我使用\"的報價只有正確的語法着想突出顯示,你可以放心地使用"單獨)

1

您將需要此:

package require csv 

由於之前,將數據分解成行並遍歷這些行。先修剪數據以避免之前或之後的空行。

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

,而不是試圖使用split命令分割CSV數據,使用專用的命令::csv::splitcsv包Tcllib。你可能已經在你的Tcl安裝了。

set words [::csv::split $line] 

當您的行被拆分時,許多數據字段周圍會出現不需要的空白。讓我們把它關掉。

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)lmaplsearchpackageputsreadsetsplitstring