2

I have a bunch of really old texts in plain ascii. The majority of the text are simple tables formatted as next:

------------------------------------------
| Some text         |  200.3 | some text |
------------------------------------------
| Another text      |  30.30 | comment   |
------------------------------------------
...many "lines" like above...

I need convert the text into "modern" document. Copying manually the cells into the TextEdit.app tables is really painfull job. (I'm using OS X).

Is here some possibility with some scripting how to convert the tables into RTF or DOC format? I can try make the script myself, only need some ideas how to start...

4

3 回答 3

3

我喜欢苹果自动化服务,所以我向你展示了整个工作流程——接下来的步骤:

  • 启动 Automator.app
  • 选择Service
  • 设置接收富文本
  • 选中Output replaces selected text复选框_
  • 单击工具栏上的“显示库”(如果隐藏)

现在添加第一个动作:

  • Run shell script
  • 通过输入:to stdin
  • 将外壳更改为:/usr/bin/perl

添加以下脚本

use 5.012;
use open qw(:std :utf8);
print "<table border='1'>\n";
while(<>) {
    chomp;
    next if /^\s*[=-]*\s*$/;
    my @arr = m/(?:^|\G\|)((?:[^\\|]|\\.)*)/sg;
    print "<tr><td>" . join('</td><td>', map {s/^\s*(.*?)\s*$/$1/;$_} splice(@arr,1,-1)) . "</td></tr>\n";
}
print "</table>";

现在是第二个动作:

  • Run shell script
  • 通过输入:to stdin

添加下一个脚本

textutil -stdin -inputencoding UTF-8 -format html -convert rtf -stdout | pbcopy -Prefer rtf

并添加第三个动作:

  • Get content of the clipboard

使用一些名称保存服务,例如:Table2Rtf

工作流程:

  • 只需启动您的 TextEdit.app,
  • 加载你的 ascii 文件
  • 将文档类型更改为 RTF(菜单:格式 -> 制作富文本)
  • 选择“ascii 表”(确保选择包含所有|字符的整个表)
  • 并从TextEdit -> Services运行上述服务。

如果一切顺利 - 表格将替换为简单的 RTF 表格,您可以调整列宽等......

动作做:

  • perl脚本将文本表转换为简单的 HTMLtable
  • textutilHTML 转换为 RTF 并将 rtf 复制到剪贴板
  • 最后是获取 rtf 剪贴板内容
  • 并且因为选择了“输出替换了输入”——结果 RTF 只是简单地替换了文档中基于文本的表格。
  • 您也可以将“rtf”另存为“doc”。

Mac 的Automator.app功能非常强大,通过一些调整,您可以轻松converor.app地将所有 ascii 文件放入其中,以便转换为 rtf 文件。

于 2013-05-27T20:00:31.783 回答
1

我想我会使用一个小的 Python 脚本将其转换为 html。

#!/usr/bin/env python

import sys, re

print '<html><body><table><tr>'
for line in sys.stdin:
  if re.match(r'^-+$', line):  # separator line?
    print "</tr><tr>"
  else:  # line with values
    print ''.join('<td>%s</td>' % field for field in line.split('|'))
print '</tr></table></body></html>'
于 2013-05-27T19:43:24.583 回答
0

如果文本可靠地用 '|' 分隔 每个字段的字符,awk 语言将被证明是“总结”您的信息的好工具 :-)

  awk '-F|' -v OFS="\t" 'NF>1{ print $2, $3, $4 )' infile > outfile.tab

就个人而言,我已经有 10 多年没有搞乱 RTF 格式了。为什么你认为它是“现代的”;-)?..正如您所说的那样,您有“像上面这样的许多行”,也许您应该考虑将这些信息存储在更容易搜索或重构的位置,例如数据库?或者至少是某种电子表格应用程序。但我们会更详细地说明您发表有意义评论的意图。

如果您发现此解决方案有帮助,那么这里有 1000 篇关于 SO 的帖子显示了 awk 的类似用法。

IHTH。

于 2013-05-27T19:56:04.147 回答