2016-07-03 4 views
-1

다음과 같은 txt 파일이 있습니다. 예를 들어 6 행이 있습니다. 각 원시 문자열 또는 여러 문자열이 있습니다. 예를 들어 첫 번째 행에는 문자열이 하나만 있지만 두 번째 행에는 두 개가 있습니다 (쉼표로 구분됩니다). 예를 분명하게하기 위해 행 수를 입력하십시오.한 df에서 다른 df로 문자열 강조 표시

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 

있습니다. 다음과 같은 역할이 있습니다.

1 문자열이 첫 번째 txt에 있고 두 번째 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 

두 번째 데이터의 첫 번째 문자열은 첫 번째 데이터의 문자열 (각 요소의 문자열은 쉼표로 구분됨)과 유사하므로 그대로두면 색인이 필요하지 않습니다.

초 TXT 파일 번째 문자열은 2 행 제 txt 파일에서 해당 행의 첫 번째 문자열 유사 그래서 2_1

초 TXT에서 여섯 문자열 다섯 번째 행과 유사한 얻고 첫 번째 txt의 첫 번째 문자와 첫 번째 txt 파일의 여섯 번째 행과 첫 번째 문자열과 유사하므로 5_1 및 6_1

등을 얻습니다.

+0

나는 길이가 무언가가되어서 마지막 것이 잘되지 않았다고 생각한다. – akrun

+0

예, 실행 해 보겠습니다. 제발 시간 좀주세요. – akrun

+0

한 가지 경우에 하나 이상의 일치 항목이 있음을 발견했습니다. 그런 경우 어떻게해야합니까? – akrun

답변

2

나는 다음 루비 코드가 작동해야 같아요 이 있는지 확인 쉼표로 구분 당신이 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 

좀 지저분 코드에 대한 유감 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 

에서

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

출력 df2.txt df1.txt

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

,하지만 작동합니다. 호프가 도움이된다 :)

+0

@ nik 확인해 주시겠습니까? –

+0

당신은 대답이 적절하고 일한다고 생각할 때만 할 수 있습니다 :). –

+0

@nik이 코드를 업데이트했습니다. 이 답변에서 여분의 (회화 적) 의견을 제발 바꿀 수 있습니까? 불필요한 느낌. 그걸로 SO를로드하지 마라. –

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"] 
+0

나는 그것을 매우 분명하게했다! !! 나는 지금 당신이 나의 질문을 따를 수 있기를 희망한다. – nik

+0

나의 대답이 정확하다면 설명 할 것이 없다. 질문에 "P41152"가 'P41152_2_1'이어야하는 이유는 무엇입니까? –

+0

나는 편집을했으나 질문을 완전히 이해할 수 있을지 확실하지 않습니다. 'arr1 = [ "abc", "def, abc", "ghi"]'및'arr2 = [ "abc", "ghi"]'라고 가정하십시오. 대답은'[ "abc_2_2", "ghi"]'(내 현재 대답) 또는'[ "abc_1_1_2_2", "ghi"]'입니까? –

관련 문제