将文件中的字符串转换为十六进制(Ruby)第二部分

时间:2018-02-27 16:49:09

标签: ruby ubuntu

我是Ruby新手并尝试将包含DNA序列的文本文件转换为十六进制输出。我目前正在使用哈希来匹配带有十六进制值的字符串。

示例输入文件可能包含ctgcagccgc cgactgaaat。在这种情况下,输出应为79259 61E03。

如何正确散列文件以将哈希表键值从字符串输出到十六进制或其他字符串值?

以下是我到目前为止:

#dna_sequencing.rb

sequence_dna = {
  "aa" => 0, "ac" => 1, "ag" => 2, "at" => 3, "ca" => 4, "cc" => 5, 
  "cg" => 6, "ct" => 7, "ga" => 8, "gc" => 9, "gg" => 'A', 
  "gt" => 'B', "ta" => 'C', "tc" => 'D', "tg" => 'E', "tt" => 'F'
}
File.open("dna_sequences.txt") do |line|
    #puts line
    line.each do |fp|
        key, value = fp.chomp.split(" ")
        sequence_dna[key] = value
        #puts sequence_dna[key]
        puts sequence_dna
    end
end

3 个答案:

答案 0 :(得分:2)

'ctgcagccgc cgactgaaat'.gsub(/\w./, sequence_dna)
=> "79259 61E03"

答案 1 :(得分:1)

input = 'ctgcagccgc cgactgaaat'
output =
  input.split.map do |s|
    s.chars.each_slice(2).map { |g| sequence_dna[g.join] }
  end.map(&:join).join(' ')
#⇒ "79259 61E03"

答案 2 :(得分:0)

因为在任何现实世界的DNA分析中你都会遇到大文件,我会建议一个程序从一个文件读取并写回另一个文件。这样就可以避免内存不足。

下面的sequence方法处理文件读写。 dna_to_hex方法在逐行的基础上进行比较和替换。

SEQUENCE_DNA = {
    'aa' => '0', 'ac' => '1', 'ag' => '2', 'at' => '3', 'ca' => '4', 'cc' => '5',
    'cg' => '6', 'ct' => '7', 'ga' => '8', 'gc' => '9', 'gg' => 'A',
    'gt' => 'B', 'ta' => 'C', 'tc' => 'D', 'tg' => 'E', 'tt' => 'F'
}

def sequence(input_file_name, output_file_name)
  File.open(output_file_name, 'w') do |output_file|
    File.open(input_file_name).each_line { |line| output_file.write(dna_to_hex(line)) }
  end
end

def dna_to_hex(line)
  line.gsub(/\S./, SEQUENCE_DNA)
end

您可以通过传递输入文件的名称和输出文件的名称来使用它:

>> sequence('dna_sequences.txt', 'dna_output.txt')

编辑:我从@StefanPochmann那里借用了字符串替换方法,因为它似乎是解决这个问题的最佳选择。