我目前正在制作一个脚本来分析一些遗传数据,然后在彩色 Word 文档中生成输出。该脚本有效,但是,脚本中的一种方法写得不好,即创建 Word 文档的方法。
创建文档的方法会创建一个独立的 HTML 文件,然后使用“docx”扩展名保存该文件,这允许我为文档的不同部分赋予不同的样式。
以下是使其正常工作的最低要求。它包括一些示例输入数据,这些数据将在最后一步之前以不同的方法创建并存储在哈希中,以及必要的方法。
require 'bio'
def make_hash(input_file)
input_read = Hash.new
biofastafile = Bio::FlatFile.open(Bio::FastaFormat, input_file)
biofastafile.each_entry do |entry|
input_read[entry.definition] = entry.aaseq
end
return input_read
end
def to_doc(hash, output, motif)
output_file = File.new(output, "w")
output_file.puts "<!DOCTYPE html><html><head><style> .id{font-weight: bold;} .signalp{color:#000099; font-weight: bold;} .motif{color:#FF3300; font-weight: bold;} h3 {word-wrap: break-word;} p {word-wrap: break-word; font-family:Courier New, Courier, Mono;}</style></head><body>"
hash.each do |id, seq|
sequence = seq.to_s.gsub("\[\"", "").gsub("\"\]", "")
id.scan(/(\w+)(.*)/) do |id_start, id_end|
output_file.puts "<p><span class=\"id\"> >#{id_start}</span><span>#{id_end}</span><br>"
output_file.puts "<span class=\"signalp\">"
sequence.scan(/(\w+)-(\w+)/) do |signalp, seq_end|
output_file.puts signalp + "</span>" + seq_end.gsub(/#{motif}/, '<span class="motif">\0</span>')
output_file.puts "</p>"
end
end
end
output_file.puts "</body></html>"
output_file.close
end
hash = make_hash("./sample.txt")
to_doc = to_doc(hash, "output.docx", "WL|KK|RR|KR|R..R|R....R"
这是一些示例数据。实际上,在分析一个物种的遗传数据时,这可以由数十万个序列组成:
>isotig00001_f4_14 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00001_f4_15 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
>isotig00003_f6_8 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00003_f6_9 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
>isotig00004_f6_8 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00004_f6_9 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
>isotig00009_f2_3 - Signal P Cleavage Site => 22:23
MLKCFSIIMGLILLLEIGGGCA-IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNCSGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD
>isotig00009_f3_9 - Signal P Cleavage Site => 16:17
MKTGIIIFISTVVVLP-ITLKPCGVPFSCCIPDQASGVANTQCGYGVRSPEQQNTFHTKIYTTGCADMFTMWINRYLYYIAGIAGVIVLVELFGFCFAHSLINDIKRQKARWAHR
>isotig00009_f6_13 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00009_f6_14 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
每个读取由两部分组成:seq id(以 a 开头的行>
)和序列。这是拆分的,并存储在make_hash
方法中的散列中。这个例子:
>isotig00001_f4_14 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
由。。。制成由。。。做成:
>isotig00001_f4_14 (the first part of the id - class="id")
Signal P Cleavage Site => 11:12 (the second part of the id - normal writing)
(new line)
MMHLLCIVLLL (first part of the sequence - class="signalp")
KW WL LL (the second part of the sequence - the motif KW will be class="motif")
在 HTML 中它会产生:
<p>
<span class="id"> >isotig00001_f4_14</span><span>Signal P Cleavage Site => 11:12</span>
<br>
<span class="signalp">MMHLLCIVLL</span><span>KW</span><span class="motif">KW</span><span>LL</span>
基本上,我想to_doc
使用适当的 HTML 模板脚本(例如 SLIM/HAML/NOKOGIRI/ERB)重写该方法。我试图完成这件事。
由于某种原因,循环中的循环不起作用,并且创建一个全局变量来存储这些变量也不起作用。
上面的脚本有效,只需将示例数据保存为“sample.txt”,然后运行脚本。
我将非常感谢任何帮助。