根据代码块的结果创建组织表

时间:2019-04-09 18:17:21

标签: emacs org-mode org-babel

我正在尝试基于使用“;”的CSV文件的内容创建组织表。作为分隔符。

我认为使用源代码块来“捕获”文件的内容,然后将结果传递给创建表的函数会很容易,但是我陷入了困境:我找不到一种方法使用第一个源代码块的“结果”。我知道的功能(org-table-convert-region)期望可以使用一个区域,但我不知道如何将“ cat”编辑的文本作为区域传递。

#+NAME: csvraw
#+BEGIN_SRC sh :results raw
  cat afile.csv
#+END_SRC

非常感谢您的帮助,以生成一个代码块,该代码块从我的csv文件中生成一个组织表,该文件包含以下行:

ID;Region;SubRegion;Area;No
1234;Asia;India;45;2
24251;Europe;Romania;456;67

2 个答案:

答案 0 :(得分:3)

org-table-convert-region(绑定到C-c |)可以很简单地进行转换。唯一的技巧是将;指定为分隔符。您可以通过使用适当的前缀参数来调用它-文档字符串说:

(org-table-convert-region BEG0 END0 &optional SEPARATOR)

Convert region to a table.

The region goes from BEG0 to END0, but these borders will be moved
slightly, to make sure a beginning of line in the first line is included.

SEPARATOR specifies the field separator in the lines.  It can have the
following values:

(4)     Use the comma as a field separator
(16)    Use a TAB as field separator
(64)    Prompt for a regular expression as field separator
integer  When a number, use that many spaces, or a TAB, as field separator
regexp   When a regular expression, use it to match the separator
nil      When nil, the command tries to be smart and figure out the
         separator in the following way:
         - when each line contains a TAB, assume TAB-separated material
         - when each line contains a comma, assume CSV material
         - else, assume one or more SPACE characters as separator.

(64)值仅连续三个C-u,因此过程如下:

  • 使用C-x i插入CSV文件。
  • C-x C-x将插入的内容标记为活动区域。
  • C-u C-u C-u C-c | ; RET

更酷的是,在CSV文件的第一行和其余各行之间保留一个空行,将使第一行自动成为表格的标题。

您也可以将其包装在代码块中:

#+begin_src elisp :var file="/tmp/foo.csv" :results raw
  (defun csv-to-table (file)
    (with-temp-buffer
      (erase-buffer)
      (insert-file file)
      (org-table-convert-region (point-min) (point-max) ";")
      (buffer-string)))

  (csv-to-table file)
#+end_src

#+RESULTS:
| a | b | c |
|---+---+---|
| d | e | f |
| g | h | i |

答案 1 :(得分:1)

(defun jea-convert-csv-to-org-table (fname)
  (interactive "fCSV to convert: ")
  (let ((result '("|-\n")))
    (with-temp-buffer
      (save-excursion (insert-file-contents-literally fname))
      (while (and (not (eobp)) (re-search-forward "^\\(.+\\)$" nil t nil))
        (push (concat "|" (replace-regexp-in-string ";" "|" (match-string 1)) "|\n")
              result))
      (push '"|-\n" result))
    (concat (seq-mapcat #'identity (reverse result)))))

将elisp代码安装在〜/ .emacs文件中,然后重新启动emacs。或者更好的是,eval使其存在( CTRL + x,CTRL + e ALT + x eval-last-sexp )。

#+NAME: csvraw
#+BEGIN_SRC elisp :results raw
  (jea-convert-csv-to-org-table "/Users/jamesanderson/Downloads/test1.csv")
#+END_SRC

请注意,上述内容已从elisp更改为sh。这是它的实际效果: emacs converting csv to org table

该代码并未针对大型文件进行优化,并且坦率地说,很快就将它们组合在一起。但是,经过少量测试,似乎可以正常工作。