【问题标题】:Converting ascii formatted tables to rtf将 ascii 格式的表格转换为 rtf
【发布时间】:2013-05-27 18:52:40
【问题描述】:

我有一堆非常古老的纯 ascii 文本。大部分文本都是简单的表格,格式如下:

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

我需要将文本转换为“现代”文档。手动将单元格复制到 TextEdit.app 表中是一项非常痛苦的工作。 (我使用的是 OS X)。

这里是否有一些脚本可以将表格转换为 RTF 或 DOC 格式?我可以尝试自己制作脚本,只需要一些想法如何开始......

【问题讨论】:

  • 想法?使用两步转换:1)将文本表转换为 HTML 2)将 HTML 转换为 RTF。您可以使用 Automator.app 进行“服务”。

标签: macos bash text replace applescript


【解决方案1】:

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

  • 启动 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 -&gt; Services 运行上述服务。

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

动作做了:

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

Mac 的Automator.app 非常强大,通过一些调整,您可以创建一个converor.app,然后简单地将所有 ascii 文件放入其中以转换为 rtf 文件。

【讨论】:

  • 别管它了。如果您的输入是 ascii - utf8 将毫无问题地工作。
【解决方案2】:

我想我会使用一个小的 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>'

【讨论】:

    【解决方案3】:

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

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

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

    如果您觉得此解决方案有帮助,S.O. 上有 1000 条帖子。显示 awk 的类似用法。

    IHTH。

    【讨论】:

      猜你喜欢
      • 2014-03-11
      • 2015-11-20
      • 2011-09-06
      • 1970-01-01
      • 2015-12-23
      • 2014-04-18
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多