2017-03-13 92 views
-1

打算使用tcl提取目錄路徑的值。目錄路徑是這樣的:使用tcl提取目錄路徑中的某個值

C:\working\636-3419-3\S80\FILE 

的目錄路徑並不總是相同的,由於不同的PC上不同的用戶,有些是:

C:\Users\name\351-3100-11\Desktop 
Z:\backup\S70\721Z3121-3\FILE 

我需要提取值(636-3419-3351-3100-11 ...這些數字總是不同的),並設置爲一個變量(mom_number),後面我使用它($mom_number)。

我試圖拆分斜線上的路徑,它的工作原理,但對於其他情況下,我不知道如何只獲取數字值。請以代碼示例爲例。非常感謝。

下面是我寫的,其只能提取636碼.....

set mom_pn_number $mom_part_name 
# Separate data with the character "\" 
set pn_num [split $mom_pn_number \\] 
# To search for the number from the separated data 
set pn_number [lsearch -inline $pn_num 636*] 
set mom_part_number $pn_number 

(該$mom_part_name是完整的目錄路徑),我不知道是否if和else語句將作品,但總是帶有錯誤。

這些數字可以是從0到9的任何類型,就像不同產品的序列號一樣。我嘗試使用[split $mom_pn_number \\]來分割路徑,它與由空格分隔的輸出一起工作。

至於

C:\Users\name\351-3100-11\Desktop 

我的意圖的結果是351-3100-11

如果一些用戶的一些其他目錄中保存自己的文件,下面的例子:

Z:\backup\S70\721Z3121-3\FILE 

我的意圖的結果是721Z3121-3

感謝

+1

如果你添加你的代碼,它確實可以幫助任何人。 – oneNiceFriend

+0

另外,這些數字有什麼共同之處?他們總是「數字號碼」嗎?他們是否可以在單一路徑中多次出現,如果他們這樣做,您是否總是需要第一個實例? – Jerry

+0

'C:\ Users \ name \ 351-3100-11 \ Desktop'和'Z:\ backup \ S70 \ 721Z3121-3 \ FILE'之間有什麼共同之處?前者似乎與您所介紹的「636-3419-3或351-3100-11 ...」相匹配,但應該從「Z:\ backup \ S70 \ 721Z3121-3 \ FILE」中提取出來? – kostix

回答

0

不要爲文件名使用split。使用file split(因爲它處理一些棘手的情況)規範化的名稱(以防止醜陋的意外)。然後用正確的模式使用lsearch;這個恰巧用正則表達式來表達更容易。

set items [file split [file normalize $mom_part_name]] 
set mom_part_number [lsearch -inline -regexp $items {^[-0-9]+$}] 

的關鍵在於,它假定所有的零件編號是數字和破折號,如果你想設置一個RE字符短線,那麼你必須把它們放在第一。

+0

謝謝,它的工作原理和解決我的問題。如果我需要搜索指定的字符,怎麼樣?像我的帖子例子C:\ Users \ name \ 351-3100-11 \ Desktop和Z:\ backup \ S70 \ 721Z3121-3 \ FILE,我需要提取「桌面」和「備份」,應該是什麼代碼$ items {^ .....]。正如你可以看到你教我的範圍是-0-9,現在我有6個目錄路徑列表,而我的這個tcl只是運行在個人電腦上。 – Alan

0

對於C:\Users\name\XYZ-nnnn-nn\Desktop風格的路徑名做

set fname {C:\Users\name\XYZ-nnnn-nn\Desktop} 
set nns [lindex [file split $fname] 3] 

set pn_number [lindex [split $nns -] 0] 

如果你真的想依靠發現其以數字開頭的第一個路徑組件,只是這樣做:

set parts [file split $fname] 
set pix [lsearch -glob $parts {[0-9]*}] 
set pn_number [lindex [split [lindex $parts $pix] -] 0] 

也就是說,

  1. 將文件名拆分成部分(Z:\,blah ,...)。
  2. 查找以任何十進制數字開頭的第一個元素的索引。
  3. 使用該索引,以獲得實際的元素(lindex),然後 它split-秒,佔據第一位(lindex再次)。
+0

明天我會試試,現在辦公室即將關閉。順便說一句,非常感謝你用我寫了幾個星期的代碼,用trimleft或trimright .....你寫的第二個選項是我想要的。 – Alan

-1

以下代碼正在工作。檢查。 SBORDOLO-M-V1VG:實驗sbordolo $六T5

set a {C:\working\636-3419-3\S80\FILE} 
set b {C:\Users\name\351-3100-11\Desktop Z:\backup\S70\721Z3121-3\FILE} 

foreach line [list $a $b] { 
if {[regexp -- "(\[0-9\]+\[-\]\[0-9\]+\[-\]\[0-9\]+)" $line - dir]} { 
    puts "yes: $dir" 
} else { 
    puts "not matched" 
} 
} 

SBORDOLO-M-V1VG:實驗sbordolo $

tclsh t5 
    yes: 636-3419-3 
    yes: 351-3100-11 
+0

我在Donal Fellows的幫助下解決了我的問題。設置項目[文件分割[file normalize $ mom_part_name]] set mom_part_number [lsearch -inline -regexp $ items {^ [ - 0-9] + $}] – Alan

0

試試這個:

set pattern {.*\\(([0-9A-Z]+-?)*)\\.*} 
set foo {C:\Users\name\351-3100-11\Desktop} 
set bar {Z:\backup\S70\721Z3121-3\FILE} 

set result [regexp -inline -all -- $pattern $foo] 
if {[llength $result] > 0} { 
    puts "foo::$foo -> [lindex $result 1]" 
} 

set result [regexp -inline -all -- $pattern $bar] 
if {[llength $result] > 0} { 
    puts "bar::$bar -> [lindex $result 1]" 
} 

執行輸出:

foo::C:\Users\name\351-3100-11\Desktop -> 351-3100-11 
bar::Z:\backup\S70\721Z3121-3\FILE -> 721Z3121-3