Подтвердить что ты не робот

Emacs: импортировать CSV в org-mode

Emacs имеет очень приятное расширение по имени org-mode.

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

Обратите внимание, что частью моей проблемы являются текстовые строки с запятой внутри них. 1,2,3,4 отличается от 1,2, 3,4 дюйма.

Есть ли там функция или perl script, которую можно запустить, чтобы преобразовать файл csv в формат org-mode?

Спасибо!

4b9b3361

Ответ 1

В руководстве org-mode:

C-c | Преобразование активной области в Таблица. Если каждая строка содержит хотя бы один символ TAB, функция предполагает, что материал является вкладкой разделены. Если каждая строка содержит запятая, значения, разделенные запятыми (CSV). Если нет, строки разделяются в пробелах в полях. Вы можете использовать аргумент префикса для принудительного разделитель: силы C-u CSV, C-u C-u заставляет TAB и числовой аргумент N указывает, что по крайней мере N последовательных или, наоборот, TAB будет разделитель. Если нет активных области, эта команда создает пустую Org table.

Итак, просто вставьте данные в файл org, выберите его и сделайте C-u C-c |.

Ответ 2

Я предполагаю, что вы хотите конвертировать CSV именно в таблицы в режиме . Если это не так, вы можете захотеть более четко указать формат вывода в своем вопросе.

Что-то вроде этого должно это сделать или, по крайней мере, дать вам отправную точку, которую вы можете взломать:

  #!/usr/bin/perl

  use strict;
  use warnings;

  use Text::CSV;

  my $csv = Text::CSV->new();

  while ( my $line = <DATA> ) {
    if ( $csv->parse( $line )) {
      my $str = join '|' , $csv->fields();
      print "|$str|\n";
    }
  }


  __DATA__
  1,2,3,4
  1,2,"3,4"

Ответ 3

Посмотрите:

C-h f org-table-convert-region

Я всегда конвертирую csv, поэтому я добавил это в мои .emacs.

(defun org-convert-csv-table (beg end)
  (interactive (list (mark) (point)))
  (org-table-convert-region beg end ",")
  )

(add-hook 'org-mode-hook
      (lambda ()
    (define-key org-mode-map (kbd "<f6>") 'org-convert-csv-table)))

Обновление

Вот еще одна функция, которая также учитывает цитируемые запятые:

 a,"12,12",b --> a | 12,12 |b

не стесняйтесь его улучшать: -).

(defun org-convert-csv-table (beg end)
  ; convert csv to org-table considering "12,12"
  (interactive (list (point) (mark)))
  (replace-regexp "\\(^\\)\\|\\(\".*?\"\\)\\|," (quote (replace-eval-replacement
                            replace-quote (cond ((equal "^" (match-string 1)) "|")
                                                   ((equal "," (match-string 0)) "|")
                                                   ((match-string 2))) ))  nil  beg end)

Ответ 4

Попробуйте следующее:

;; Insert a file and convert it to an org table
(defun aleblanc/insert-file-as-org-table (filename)
  "Insert a file into the current buffer at point, and convert it to an org table."
  (interactive (list (ido-read-file-name "csv file: ")))
  (let* ((start (point))
    (end (+ start (nth 1 (insert-file-contents filename)))))
    (org-table-convert-region start end)
    ))

Ответ 5

Вот немного взлома, но он работает.

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

Наконец, я делаю макрос, который делает что-то вроде этого:

C-a    ; Beginning-of-line
|      ; Self-insert-char
C-e    ; end-of-line
|      ; Self-insert-char
<down> ; Down one line

(Я не уверен на 100%, если | является self-insert- char или нет, поэтому лучше всего записать свой собственный макрос)

Вкладка "Хит" находится где-то посередине таблицы, а org-mode форматирует ее правильно. Мне это легче сделать в суженной области.

Предостережение: если у вас есть вертикальная полоса на вашем входе.. это, вероятно, не будет работать совершенно правильно. Ситуации, подобные этому, должны быть легко выявлены и относительно легко исправить.

Как правило, при импорте чего-то текстового в орг-режим, я нашел комбинацию некоторых умных макросов, а поиск-замена - самый простой способ

Я надеюсь, что это поможет.