web-dev-qa-db-ja.com

Emacsで区切り文字で区切られた値のファイルを、読むのに役立つ強調表示とともに表示するにはどうすればよいですか?

Emacsで区切り文字で区切られた値のファイルを、読むのに役立つ強調表示とともに表示するにはどうすればよいですか?

理想的には、区切り文字/文字列はカスタマイズ可能である必要があります。

Emacsができない場合、このタスクのためにLinuxで利用できる他のツールはありますか?

2
qazwsx

@Ammarのソリューションについてコマンドorg-table-convert-regionを「修正」して、セパレータの正規表現を取得することは難しくありません。この場合は、%%だけです。 1行追加しました。

(defun 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
integer  When a number, use that many spaces as field 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."
  (interactive "rP")
  (let* ((beg (min beg0 end0))
         (end (max beg0 end0))
         re)
    (goto-char beg)
    (beginning-of-line 1)
    (setq beg (move-marker (make-marker) (point)))
    (goto-char end)
    (if (bolp) (backward-char 1) (end-of-line 1))
    (setq end (move-marker (make-marker) (point)))
    ;; Get the right field separator
    (unless separator
      (goto-char beg)
      (setq separator
            (cond
             ((not (re-search-forward "^[^\n\t]+$" end t)) '(16))
             ((not (re-search-forward "^[^\n,]+$" end t)) '(4))
             (t 1))))
    (goto-char beg)
    (if (equal separator '(4))
        (while (< (point) end)
          ;; parse the csv stuff
          (cond
           ((looking-at "^") (insert "| "))
           ((looking-at "[ \t]*$") (replace-match " |") (beginning-of-line 2))
           ((looking-at "[ \t]*\"\\([^\"\n]*\\)\"")
            (replace-match "\\1")
            (if (looking-at "\"") (insert "\"")))
           ((looking-at "[^,\n]+") (goto-char (match-end 0)))
           ((looking-at "[ \t]*,") (replace-match " | "))
           (t (beginning-of-line 2))))
      (setq re (cond
                ((stringp separator) separator) ;; <-- I added this line
                ((equal separator '(4)) "^\\|\"?[ \t]*,[ \t]*\"?")
                ((equal separator '(16)) "^\\|\t")
                ((integerp separator)
                 (if (< separator 1)
                     (error "Number of spaces in separator must be >= 1")
                   (format "^ *\\| *\t *\\| \\{%d,\\}" separator)))
                (t (error "This should not happen"))))
      (while (re-search-forward re end t)
        (replace-match "| " t t)))
    (goto-char beg)
    (org-table-align)))

残念ながら、それは私にとって非常に苛立たしい|から逃れることはできず、引用符もまったく処理しません。区切り文字がセルに表示されないと仮定すると、|を別のものに置き換える関数を作成するのは難しくありません(たとえば、LaTeXにエクスポートする場合は\vert{}、または⏐これはユニコード文字VERTICAL LINE EXTENSION)であり、次にorg-table-convert-regionの修正バージョンを実行します。必要に応じて、"%%%%"%%に置き換えることもできます。もちろん、私は%%を、必要な区切り文字(関数の引数になる可能性があります)の代用として使用しました。

それはすべて、そのようなファイルを見る頻度と、ファイルにどれだけの作業を入れたいかを知るために必要な機能によって異なります。 :-)

2
Ivan Andrus

Emacsでは、highlight-phraseM-s h p)またはhighlight-regexpM-s h r)でテキストを強調表示できます。

1
cYrus

区切り文字を|に変更できます。 (たとえば、sedで、ただし最初にすべての|を別のものに置き換えます)、1つ追加します|すべての行の始まりと終わりまで、ファイルをorg-modeのemacsで開きます。

csv-modeとそのcsv-align-fieldsを使用することもできます。

0
choroba

Org-modeがある場合は、CSVファイルを開き、メジャーモードをorg-modeに設定し、バッファー全体にマークを付け、C-|をクリックして、CSVファイルをorg-modeテーブルに変換します。

Emacsのcalcと組み合わせて、org-modeテーブルに対して何でもできます。これは、スプレッドシートアプリケーションよりも強力です。参照については、 ここ を参照してください。

Linuxの場合、CSVファイルを処理するために使用できるツールは無限にありますが、スイスナイフはひどいものでなければなりません。できればawkを学びましょう。そうすればあなたの生活が楽になります。

0
Ammar Alammar