2015-10-09 30 views
0
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> 
+0

你有沒有考慮過使用xml解析器,比如nokogiri,而不是字符串匹配?這將允許您迭代一個文件,並使用#css在另一個文件中搜索相同的ID。 –

+0

我有問題安裝一些紅寶石工具,包括nokogiri,這就是爲什麼我使用字符串匹配和正則表達式@ BrianMurphy-Dye –

+0

很酷,那麼也許這樣:(1)解析第二個文件到一個散列,與id作爲散列鍵內部文本作爲值,然後(2)迭代第一個文件中的行,並使用此id和hash [id]構建新文件。 –

回答

1
unordered_file = File.read('unordered_file') 
unordered_lines = unordered_file.each_line.reduce(Set.new) {|set, line| set << line} 
ordered_file = File.read('ordered_file') 
File.open('out', 'w') do |f| 
    ordered_file.each_line {|line| f.puts(line) if unordered_lines.contains?(line)} 
end 

應工作假設你有沒有重複的行ordered_file

+0

有沒有Set命令的替代方法?我得到未定義的局部變量運行時設置。我認爲這是因爲我在窗口上運行紅寶石 –

+0

您可以使用哈希,只是使用值 –

1

喬希,除了看起來他需要匹配線條而不是整個線條,因爲內部文本有時會有所不同。用這樣的東西代替File.open循環內的文本可能會起作用:

ordered_file.each_line do |line| 
    m = /x:Key="(\S+)"/.match(line) 
    f.puts(line) if m and unordered_lines.contains?(m[1]) 
end 
+0

我不能使用包含命令,我認爲這是因爲我在Windows上運行ruby。我嘗試使用.include但我不工作 –

+0

非常抱歉,這應該是unordered_lines.include?(m [1]) –

相關問題