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

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

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

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

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

решение1

Что касается решения @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, или на ⏐, который является символом Unicode VERTICAL LINE EXTENSION), а затем запустить измененную версию org-table-convert-region. Вы даже можете заменить "%%и %%"на %%, если хотите. Конечно, я использовал %%в качестве замены для любого разделителя, который вам нужен (который может быть аргументом функции).

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

решение2

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

решение3

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

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

решение4

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

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

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

Связанный контент