web-dev-qa-db-ja.com

Emacs:CSVをorg-modeにインポートする

Emacsにはorg-modeという名前の非常に素晴らしい拡張機能があります。

大きな悲しみを感じることなく、CSVファイルをorgモードに簡単にロードできるようにしたいと思います。私が見つけたのは、テーブルのインポートまたはテーブルのキャプチャだけです。これらは、簡単に言えば、ほぼうまく機能しません。

私の問題の一部は、コンマを含むテキスト文字列であることに注意してください。 1,2,3,4は、1,2、 "3,4"とは異なります。

Csvファイルをorg-mode形式に変換するために実行できる関数またはPerlスクリプトはありますか?

ありがとう!

44
Paul Nathan

Org-modeマニュアルから:

C-c |アクティブな領域をテーブルに変換します。すべての行に少なくとも1つのTAB文字が含まれている場合、関数はマテリアルがタブで区切られていると想定します。すべての行にコンマが含まれている場合、コンマ区切り値(CSV)が想定されます。そうでない場合、行は空白でフィールドに分割されます。プレフィックス引数を使用して、特定の区切り文字を強制できます。C-uはCSVを強制し、C-u C-uはTABを強制し、数値引数Nは、少なくともN個の連続するスペースを示します。または、TABが区切り文字になります。アクティブな領域がない場合、このコマンドは空のOrgテーブルを作成します。

したがって、データを組織ファイルに貼り付けて選択し、C-u C-c |を実行するだけです。

73
Don Womick

CSVを具体的にorg-mode tablesに変換したいとします。そうでない場合は、質問の出力形式についてより明確にする必要があります。

このような何かがそれを行うか、少なくともあなたがハックできる出発点を得るはずです:

  #!/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"
5
genehack

見て:

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
DJJ

これを試して:

;; 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)
    ))
2
Aleblanc

これはちょっとしたハックジョブですが、うまくいきます。

cSVファイルをエクスポートするときは、各エントリを引用符で囲み、すべての","を縦棒として置き換えます。

最後に、次のようなマクロを作成します。

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

(|が自己挿入文字であるかどうかは100%わからないので、独自のマクロを記録するのが最善です)

テーブルの中央のどこかでタブを押すと、org-modeが適切にフォーマットします。狭い地域ではこれが簡単だと思います。

警告:入力に垂直バーがある場合、おそらく正しく機能しません。そのような状況は、見つけやすく、比較的簡単に修正できるはずです。

一般に、テキストのようなものをorg-modeにインポートする場合、いくつかのスマートなマクロ書き込みと検索置換の組み合わせが最も簡単な方法であることがわかりました。

それがお役に立てば幸いです。

1
Jonathan Arkell