![Как просмотреть файл со значениями, разделенными разделителями, в Emacs с подсветкой, удобной для чтения?](https://rvso.com/image/1303447/%D0%9A%D0%B0%D0%BA%20%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D1%82%D1%8C%20%D1%84%D0%B0%D0%B9%D0%BB%20%D1%81%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%2C%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8%2C%20%D0%B2%20Emacs%20%D1%81%20%D0%BF%D0%BE%D0%B4%D1%81%D0%B2%D0%B5%D1%82%D0%BA%D0%BE%D0%B9%2C%20%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B9%20%D0%B4%D0%BB%D1%8F%20%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D1%8F%3F.png)
Как просмотреть файл со значениями, разделенными разделителями, в 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, это облегчит вам жизнь.