我有这个字符串:
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.AT2
和RSN88_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 :(得分: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), foreach, lmap (for Tcl 8.5), lmap, lsearch, package, puts, read, set, split, string
答案 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 {\" }]}]
(我只是为了正确的语法突出显示而使用\"
作为引号,您可以安全地单独使用"