编写重复性任务的最佳方法是什么?

时间:2012-11-01 09:04:30

标签: html layout replace

对于模糊的标题和标签感到抱歉,因为这个问题非常具体。

我不是一个大型的脚本编写者或编码器。我运行一个网站,需要每周更新几次某些结果。结果由特殊软件创建,并以这些格式之一导出; html,pdf,doc,xls,rpt,ttx,csv,odbc,rec,rtf或xml。

由于我的网站使用的表格布局与导出的文件不同,因此我目前在my和tags之间复制并粘贴信息。我只花了几分钟,但我想知道如何自动化这个?导出的文件如下所示:

1    John and George    12
2    Peter and Suzan    10
3    Allan and Ed        8

并且需要在这方面做一些事情:

<table width="100%" cellspacing="0" class="tabels" id="top">
<tr>
<td colspan="3" class="tabel"><b> Groupp A</b></td>
</tr>
<tr>
<td class="tabel"><strong> 1. </strong></td>
<td class="tabel">John and George</td>
<td class="tabel">12</td>
</tr>
<tr>
<td class="tabel"><strong>2.</strong></td>
<td class="tabel">Peter and Suzan</td>
<td class="tabel">10</td>
</tr>
<tr>
<td class="tabel"><strong> 3. </strong></td>
<td class="tabel">Allan and Ed</td>
<td class="tabel">8</td>
</tr>

这可能是非常基本的。我想一些查找和替换命令应该可以解决问题。我尝试过使用Notepad ++,但我想知道你们会怎样处理这个问题?我可以使用linux或windows机器。

2 个答案:

答案 0 :(得分:0)

我会将awk用于这样的事情(尽管任何测试处理工具,如Perl,都可以完成任务)。

首先是输入文件:

pax> cat testprog.in

1    John and George    12
2    Peter and Suzan    10
3    Allan and Ed        8

然后,awk脚本本身:

pax> cat testprog.awk

BEGIN {
    print "<table width=\"100%\" cellspacing=\"0\" class=\"tabels\" id=\"top\">"
    print "  <tr>"
    print "    <td colspan=\"3\" class=\"tabel\"><b> Groupp A</b></td>"
    print "  </tr>"
}
{
    print "  <tr>"
    print "    <td class=\"tabel\"><strong>" $1 ".</strong></td>"

    str = ""; for (i = 2; i < NF; i++) str = str " " $i
    print "    <td class=\"tabel\">" substr (str,2) "</td>"

    print "    <td class=\"tabel\">" $NF "</td>"
    print "  </tr>"
}
END {
    print "</table>"
}

然后,运行一个示例,以便您可以看到它正常工作:

pax> awk -f testprog.awk testprog.in

<table width="100%" cellspacing="0" class="tabels" id="top">
  <tr>
    <td colspan="3" class="tabel"><b> Groupp A</b></td>
  </tr>
  <tr>
    <td class="tabel"><strong>1.</strong></td>
    <td class="tabel">John and George</td>
    <td class="tabel">12</td>
  </tr>
  <tr>
    <td class="tabel"><strong>2.</strong></td>
    <td class="tabel">Peter and Suzan</td>
    <td class="tabel">10</td>
  </tr>
  <tr>
    <td class="tabel"><strong>3.</strong></td>
    <td class="tabel">Allan and Ed</td>
    <td class="tabel">8</td>
  </tr>
</table>

关于它是如何工作的,这将在下面解释。

BEGINEND子句只是控制在处理输入文件中的行之前和之后打印的内容。这就是表格本身和第一行。

对于每一行,您首先打印出tr标记和包含该行第一个单词的td标记。

然后根据中间参数构造另一条td行,折叠过程中的空格。

最后一个td,最后一个参数在线上,一个结束tr,你有它。转到下一行。

答案 1 :(得分:0)

这是一个Linux sed解决方案:

sed 's|\([0-9]*\) *\(.*[^ ]\)  *\([0-9]*\)$|<tr><td class="tabel"><strong>\1.</strong></td><td class="tabel">\2</td><td class="tabel">\3</td></tr>|' filename > filename.html

这只是处理表格行。其他所有内容看起来都像是静态样板文件,您应该能够在脚本中使用echo命令生成。