Создание орг-таблиц по результатам блока кода - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь создать org-таблицу на основе содержимого файла CSV, который использует ";" в качестве разделителя.

Я подумал, что было бы легко иметь блок исходного кода, чтобы "отследить" содержимое файла, а затем передать результат в функцию, которая создает таблицу, но я застрял: я не могу найти способ используйте «результаты» первого блока исходного кода. Функция, которую я знаю (org-table-convert-region), ожидает, что регион будет работать, и я не знаю, как передать текст с надписью "cat" в качестве региона.

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

Буду признателен за помощь в создании блока кода, который создает org-таблицу из моего CSV-файла, который содержит строки, подобные следующим:

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

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

Существует 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 подряд, поэтому процесс выглядит следующим образом:

  • вставить файл CSV с помощью C-x i.
  • 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 голос
/ 10 апреля 2019
(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, конвертирующий CSV в таблицу org

Код не оптимизирован для больших файлов и, честно говоря, довольно быстро собирается вместе. Но, после небольшого тестирования, похоже, работает.

...