def matchid (line, lineline)
m = /x:Key="(\S+)"/.match(line)
n = /x:Key="(\S+)"/.match(lineline)
if m == n
return true
else
return false
end
end
def matchcomment(line, lineline)
m = /<!-- (.+) -->/.match(line)
n = /<!-- (.+) -->/.match(lineline)
if m == n
return true
else
return false
end
end
def matchspace(line, lineline)
m = /(\s+)/.match(line)
n = /(\s+)/.match(lineline)
if m == n
return true
else
return false
end
end
matchline = 1
f = File.open('chi.xaml' , 'r')
file = File.open('eng.xaml' , 'r')
newFile = File.open('chinew.xaml' , 'w')
f.each_line do |line|
if matchline == 1
lineline = file.gets
else
lineline = lineline
end
if matchid(line, lineline) == true
newFile.puts(line)
matchline = 1
elsif matchcomment(line, lineline) == true
newFile.puts(line)
matchline = 1
elsif matchspace(line, lineline) == true
newFile.puts(line)
matchline = 1
else
matchline = 0
end
end
基本上,我想比較兩個具有相同ID的文件,但其中一個文件的順序已經搞亂了。 我想安排文件以匹配其他的順序,我嘗試使用上面的代碼,但似乎無法得到正確的輸出。將一個文件與另一個文件相匹配,並將其放置在同一個訂單中Ruby
行文件1:
<!-- VitalSignsView String -->
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_CPU">CPU</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_RAM">RAM</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_MB">MB</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_OPEN_BRACKET">(</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_CLOSE_BRACKET">b)</sys:String>
<!-- SetupButtonBarView -->
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_CONFIG_OVERVIEW">Config Overview</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_INSTRUMENT">Instrument Setup</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_USER_PREFERENCE">User Preference</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_HW_SW_INFO">HW/SW Info</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_INSTALLED_OPTION">Installed Options</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_EXIT">Exit</sys:String>
行文件2:
<!-- SetupButtonBarView -->
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_CONFIG_OVERVIEW">Config Overview</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_INSTRUMENT">儀器設置</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_USER_PREFERENCE">用戶喜好設置</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_HW_SW_INFO">硬件/軟件信息</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_INSTALLED_OPTION">已裝選件</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_EXIT">退出</sys:String>
<!-- VitalSignsView -->
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_CPU">CPU</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_RAM">RAM</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_MB">MB</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_OPEN_BRACKET">(</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_CLOSE_BRACKET">b)</sys:String>
輸出想要的東西:
<!-- VitalSignsView -->
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_CPU">CPU</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_RAM">RAM</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_MB">MB</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_OPEN_BRACKET">(</sys:String>
<sys:String x:Key="IDS_STRING_FSM_VITAL_SIGN_CLOSE_BRACKET">b)</sys:String>
<!-- SetupButtonBarView -->
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_CONFIG_OVERVIEW">Config Overview</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_INSTRUMENT">儀器設置</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_USER_PREFERENCE">用戶喜好設置</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_HW_SW_INFO">硬件/軟件信息</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_INSTALLED_OPTION">已裝選件</sys:String>
<sys:String x:Key="IDS_BUTTONBAR_FSM_SETUP_EXIT">退出</sys:String>
你有沒有考慮過使用xml解析器,比如nokogiri,而不是字符串匹配?這將允許您迭代一個文件,並使用#css在另一個文件中搜索相同的ID。 –
我有問題安裝一些紅寶石工具,包括nokogiri,這就是爲什麼我使用字符串匹配和正則表達式@ BrianMurphy-Dye –
很酷,那麼也許這樣:(1)解析第二個文件到一個散列,與id作爲散列鍵內部文本作爲值,然後(2)迭代第一個文件中的行,並使用此id和hash [id]構建新文件。 –