【发布时间】:2013-10-24 11:35:16
【问题描述】:
我目前正在制作一个脚本,用于分析一些遗传数据,然后在彩色 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(以> 开头的行)和序列。这是拆分的,并存储在 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>
基本上,我想使用适当的 HTML 模板脚本(例如 SLIM/HAML/NOKOGIRI/ERB)重写 to_doc 方法。我已经尝试过完成这项工作。
由于某种原因,循环中的循环不起作用,并且创建一个全局变量来存储这些变量也不起作用。
上面的脚本有效,只需将示例数据保存为“sample.txt”,然后运行脚本即可。
如果能提供任何帮助,我将不胜感激。
【问题讨论】:
-
the docx gem 您可能会感兴趣。
-
@m_x 非常有趣的宝石...但是,查看自述文件,目前没有添加颜色的方法(这就是为什么我使用 HTML,然后由文字处理器呈现。
-
所以你想生成一个包含 HTML 的文件,让你有彩色文本,然后可以被 Word 打开?为什么不直接创建标准 ERB 或 Haml 模板并输出到扩展名为“.docx”的文件?我认为你的代码做得很困难。
-
@theTinMan 是的,没错...我将如何链接模板,模板需要在公共文件夹中吗?
-
除非您运行的是网络服务器,否则不需要公用文件夹。一般来说,您的代码是像老式 PHP 一样编写的,所以别再这样了。分离您的数据、模板和代码;考虑“MVC”并将数据预处理为准备输出的信息,因此您可以在模板中循环并输出它。我们需要查看您的输入和所需输出的示例。没有它,就无法判断解决方案是否正确。
标签: ruby haml nokogiri slim-lang