从代码块的结果创建组织表
Creating org-tables from the results of a code block
我正在尝试根据使用“;”的 CSV 文件的内容创建一个 org-table作为分隔符。
我原以为有一个源代码块 "cat" 文件的内容然后将结果传递给创建 table 的函数会很容易,但我卡住了:我找不到使用第一个源代码块的 "results" 的方法。我知道的功能 (org-table-convert-region) 需要一个区域来工作,但我不知道如何将 "cat"-ed 文本作为区域传递。
#+NAME: csvraw
#+BEGIN_SRC sh :results raw
cat afile.csv
#+END_SRC
非常感谢您帮助生成一个代码块,该代码块从我的 csv 文件中生成一个 org-table,其中包含如下行:
ID;Region;SubRegion;Area;No
1234;Asia;India;45;2
24251;Europe;Romania;456;67
(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)))))
在 ~/.emacs 文件中安装 elisp 代码并重新启动 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
注意上面的 sh
到 elisp
的变化。这是它的动图:
emacs converting csv to org table
代码没有针对大文件进行优化,坦率地说,很快就拼凑在一起了。但是,经过一点点测试,似乎有效。
有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 文件中的第一行和其余行之间留下一个空行,将使第一行自动成为 table 中的 header。
您也可以将其包装在代码块中:
#+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 |
我正在尝试根据使用“;”的 CSV 文件的内容创建一个 org-table作为分隔符。
我原以为有一个源代码块 "cat" 文件的内容然后将结果传递给创建 table 的函数会很容易,但我卡住了:我找不到使用第一个源代码块的 "results" 的方法。我知道的功能 (org-table-convert-region) 需要一个区域来工作,但我不知道如何将 "cat"-ed 文本作为区域传递。
#+NAME: csvraw
#+BEGIN_SRC sh :results raw
cat afile.csv
#+END_SRC
非常感谢您帮助生成一个代码块,该代码块从我的 csv 文件中生成一个 org-table,其中包含如下行:
ID;Region;SubRegion;Area;No
1234;Asia;India;45;2
24251;Europe;Romania;456;67
(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)))))
在 ~/.emacs 文件中安装 elisp 代码并重新启动 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
注意上面的 sh
到 elisp
的变化。这是它的动图:
emacs converting csv to org table
代码没有针对大文件进行优化,坦率地说,很快就拼凑在一起了。但是,经过一点点测试,似乎有效。
有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 文件中的第一行和其余行之间留下一个空行,将使第一行自动成为 table 中的 header。
您也可以将其包装在代码块中:
#+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 |