突出显示从一个df到另一个df的字符串

时间:2016-07-03 10:11:26

标签: ruby string

我有一个如下所示的txt文件。作为一个例子,它有6行。每个raw都有一个字符串或多个字符串。例如,第一行只有一个字符串,但第二行有两个字符串(用逗号分隔)。我还把行数放到了示例中

1 P41182
2 P41152,Q9UQL6
3 P41172
4 Q92793,Q09472,Q9Y6Q9
5 Q15021,TQ9472 
6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3

我有另一个文字,如下所示。结构相同。例如,第一行只有一个字符串,但第二行有两个

1 P41182
2 P41152,Q9UYIU
3 P41172
4 Q9IO93,Q9Y6IT
5 P30561
6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
7 HT8971
8 HLI872

我想知道第二个数据中与第一个数据类似的某些字符串的索引。有如下角色:

如果第一个txt中只有1个字符串并且与第二个txt匹配,我不想知道索引。如果第一个txt中有多个字符串,其中一个他们或其中一些类似于第二个txt文件,然后我想知道它们的索引,例如输出应该如下所示
DF3

1 P41182
2 P41152_2_1,Q9UYIU
3 P41172
4 Q9IO93,Q9Y6IT
5 P30561
6 Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5
7 HT8971
8 HLI872

第一个第二个数据字符串类似于只包含1个成员的第一个数据字符串(每个元素中的字符串用逗号分隔)所以我保持原样并且我不想要索引。

第二个txt文件中的第二个字符串类似于第一个txt文件中该行的第二行和第一个字符串,因此它得到2_1

第二个txt中的第六个字符串类似于第一个txt的第五行和第一个字符串,它也类似于第一个txt文件的第六行和第一个字符串,因此它得到5_1和6_1

等等。

2 个答案:

答案 0 :(得分:2)

我假设数据可以用字符串数组表示。

arr1 = ["P41182", "P41152,Q9UQL6", "P41172", "Q92793,Q09472,Q9Y6Q9",
        "Q15021,TQ9472", "Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3"]
arr2 = ["P41182", "P41152,Q9UYIU", "P41172", "Q9IO93,Q9Y6IT", "P30561",
        "Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3", "HT8971", "HLI872"] 

h = arr1.each.with_index(1).with_object({}) do |(s1,i),h|
  next unless s1.include?(',')
  s1.split(',').each.with_index(1) { |s2,j| (h[s2] ||= '') << "_#{i}_#{j}" }
end
  #=> {"P41152"=>"_2_1", "Q9UQL6"=>"_2_2", "Q92793"=>"_4_1", "Q09472"=>"_4_2",
  #    "Q9Y6Q9"=>"_4_3", "Q15021"=>"_5_1_6_1", "TQ9472"=>"_5_2", "Q9BPX3"=>"_6_2",
  #    "Q15003"=>"_6_3", "O95347"=>"_6_4", "Q9NTJ3"=>"_6_5"} 

arr2.map {|s1| s1.split(',').map { |s2| h.key?(s2) ? "%s%s" % [s2, h[s2]] : s2 }.join(',')}
  #=> ["P41182", "P41152_2_1,Q9UYIU", "P41172", "Q9IO93,Q9Y6IT", "P30561",
  #    "Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5", "HT8971", "HLI872"]

答案 1 :(得分:2)

我想以下ruby代码应该有效: 确保以逗号分隔df1.txt和df2.txt。您将在df3.txt中输出。请参阅下面的示例txt文件。

df1_hash = {}
df1_term_positions_hash = Hash.new([])
File.readlines("df1.txt").each_with_index do |line, i|
    df1_hash[i+1] = line.strip.split(",")
    for x in line.strip.split(",")
        df1_term_positions_hash[x] += [i+1]
    end
end

df2_hash = {}
File.readlines("df2.txt").each_with_index do |line, i|
    df2_hash[i+1] = line.strip.split(",")
end

df2_size = df2_hash.size
df3_hash = {}
for i in (1..df2_size)
    df3_hash[i] = df2_hash[i].each_with_index.map do |term, intermediate_index|
        number_of_repetitions = df1_term_positions_hash[term].size      
        updated_term = term.dup
        df1_term_positions_hash[term].each_with_index do |repetition_position, index|
            if (df1_hash[repetition_position].size <= 1 rescue true )
                updated_term = term


            else
                additional_tail = "#{repetition_position}_#{df1_hash[repetition_position].index(term)+1}"               
                updated_term = updated_term + "_" + additional_tail
            end
        end
        updated_term
    end

end

File.open("df3.txt", "w") do |file|
    for i in (1..df2_size)
        file.puts df3_hash[i].join(",")
    end
end

df1.txt

P41182
P41152,Q9UQL6
P41172
Q92793,Q09472,Q9Y6Q9
Q15021,TQ9472 
Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3

df2.txt

P41182
P41152,Q9UYIU
P41172
Q9IO93,Q9Y6IT
P30561
Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
HT8971
HLI872

输出df3.txt

P41182
P41152_2_1,Q9UYIU
P41172
Q9IO93,Q9Y6IT
P30561
Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5
HT8971
HLI872
抱歉小杂乱的代码,但它的工作原理。 希望它有所帮助:)

相关问题