在Emacs中添加/删除列电子表格功能?

时间:2011-06-08 02:40:27

标签: emacs elisp

以下列格式给定分隔数据,如何插入和删除列?

abc|efg|123|xyz123abc|yes
xxx|bbb|cc|ddd|no

例如,假设我想添加一个默认值为1的第3列并删除第4列,以便数据如下所示:

abc|efg|1|123|yes
xxx|bbb|1|cc|no

我正在研究org-mode表作为起点,但它会在数据周围添加额外的空格。

| abc | efg | 123 | xyz123abc |
| xxx | bbb | cc  | ddd       |
|     |     |     |           |

3 个答案:

答案 0 :(得分:2)

除了org-mode的表格设施外,Emacs还有其他一些表格编辑功能,可以帮助你完成大部分工作。

abc|efg|123|xyz123abc|yes
xxx|bbb|cc|ddd|no

选择区域后跟
Mx table-capture RET | RET $ RET RET 1 RET

给我们:

+---+---+---+---------+---+
|abc|efg|123|xyz123abc|yes|
+---+---+---+---------+---+
|xxx|bbb|cc |ddd      |no |
+---+---+---+---------+---+

现在将点移动到要删除的列的单元格内,并使用
M-x table-delete-column RET

+---+---+---+---+
|abc|efg|123|yes|
+---+---+---+---+
|xxx|bbb|cc |no |
+---+---+---+---+

'无法识别'表格将关闭表格编辑模式,以便您可以安全地处理格式化。

M-x table-unrecognize-table RET

然后只需要搜索和替换即可恢复原始格式。

您可以通过使用 Ck Ck 删除第一行来删除所有行分隔符,并使用 M - % 删除剩余部分CY RET RET <!/ KBD>)

|abc|efg|123|yes|
|xxx|bbb|cc |no |

然后你只需要清理行前缀和后缀,以及单元格内的填充:

MC - % +| RET | RET (nb有+)之前的空格 M-C - % ^|\||$ RET RET

abc|efg|123|yes
xxx|bbb|cc|no

您可以将清理步骤记录为键盘宏(或编写函数),以便在一个步骤中执行它们。

答案 1 :(得分:2)

我刚刚发现了如何将数据导入SES(没有“ses-import”函数,但事实证明你可以简单地抽取制表符分隔的数据),所以这个答案比使用表格捕获更简单:)(除非你的数据包含标签,在这种情况下你需要解决这个问题)。

SES是Emacs中的实际电子表格应用程序。有关详细信息,请参阅其信息节点:
Ch i d m ses RET M - : (info "ses") RET

处理数据:

  1. 将原始数据转换为TSV,例如 M - % | RET TAB RET <!/ KBD>
  2. 杀死该文字(例如选择区域,然后 C-w
  3. 创建临时缓冲区并更改为ses-mode: C-x b *ses* RET
    M-x ses-mode RET
    (当然,对于ses-mode及其键绑定的描述, C-h m
  4. 将数据存入电子表格: C-y
  5. 将指针移至要删除的列,并使用 M-k
  6. 将其终止
  7. 以TSV格式将结果复制回杀戮戒指: Cx h x t
    (即mark-whole-buffer + ses-export-tsv
  8. C-x k杀死* ses *缓冲区 RET
  9. 使用 C-y
  10. 将修改后的TSV数据放回原始缓冲区
  11. 使用 M - % TAB RET | <将标签转换回| s KBD> RET <!/ KBD>
  12. 警告:我实际上遇到了在我的标准配置下进入SES的问题,但这个过程在emacs -q下工作正常。 YMMV。

答案 2 :(得分:0)

我可以想到两种手动更新的方法(虽然这可能不是你想要的):

使用矩形添加或删除字符:

cua-mode
<C-return> ;; cua-set-rectangle-mark on first row
;; create a rectangle one character wide from first to last rows
;; type '1|' to create your new column.

录制宏以添加/删除列条目并重复整个文件。