2

Как просмотреть файл с разделителями-значениями в Emacs с выделением, полезным для чтения?

В идеале символ / строка разделителя должны быть настраиваемыми.

Если Emacs не может сделать, какой-либо другой инструмент, доступный в Linux для этой задачи?

4 ответа4

2

Относительно решения @ Ammar Нетрудно "исправить" команду org-table-convert-region чтобы получить регулярное выражение для разделителя, которое в этом случае может быть просто %% . Я добавил одну строку.

(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)))

К сожалению, это не ускользнет | что очень расстраивает меня, а также не будет обрабатывать кавычки вообще. Предполагая, что разделитель не появляется в ячейке, нетрудно написать функцию, которая заменит | с чем-то другим (например, \vert{} если вы планируете экспортировать в LaTeX, или ⏐, который является символом Юникода VERTICAL VERTICAL LINE EXTENSION), а затем запустите модифицированную версию org-table-convert-region . Вы можете даже заменить "%% и %%" на %% если хотите. Конечно, я использовал %% как подставку для любого разделителя, который вы хотите (который может быть аргументом функции).

Все зависит от того, как часто вы будете смотреть на такие файлы и какие возможности вам нужно знать, сколько работы вы хотите вложить в него. :-)

1

В emacs вы можете выделить текст с помощью highlight-phrase (M-s h p) или highlight-regexp (M-s h r).

0

Вы можете изменить разделитель на | (например, с помощью sed , но сначала замените все | на что-то другое), добавьте один | к каждому началу и концу строки, затем откройте файл в emacs в org-mode .

Вы также можете использовать csv-mode и его csv-align-fields .

0

Если у вас есть org-mode, откройте файл CSV, установите основной режим в org-mode, отметьте весь буфер и нажмите C-| , чтобы преобразовать файл CSV в таблицу режима орг.

Вы можете сделать что - нибудь для орга-режим таблицы, в сочетании с известково EMACS', это более мощное , чем приложение электронных таблиц, см здесь для справки.

Для linux существуют бесконечные инструменты, которые вы можете использовать для обработки файлов CSV, но швейцарский нож должен быть awk. Изучите awk, если сможете, это облегчит вашу жизнь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .