在tcl中查找字符串中的单词

时间:2016-08-07 23:49:10

标签: string tcl

我有这个字符串:

  

1,RotD50,88,0.1582,1.2264, - ,7.4,23.6,0.2,“San Fernando”,1971,“Santa Felita Dam(Outlet)”,6.61,Reverse,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"
    }
}

2 个答案:

答案 0 :(得分:1)

你需要这个:

package require csv

和以前一样,将数据分成几行并迭代这些行。首先修剪数据以避免在之前或之后出现空行。

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

不要尝试使用split命令拆分csv数据,而是使用Tcllib中::csv::split包中的专用命令csv。您可能已经在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

答案 1 :(得分: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 {\" }]}]

(我只是为了正确的语法突出显示而使用\"作为引号,您可以安全地单独使用"