如何在 Emacs 中查看以分隔符分隔的值的文件,并以突出显示的方式帮助阅读?
理想情况下,分隔符/字符串应该是可定制的。
如果 Emacs 不能完成,Linux 上还有其他工具可以完成这项任务吗?
答案1
org-table-convert-region
关于@Ammar的解决方案,“修复”命令以采用正则表达式作为分隔符并不困难,在这种情况下,它可能只是%%
。我添加了一行。
(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-mode 表格做任何事情,结合 emacs 的 calc,它比电子表格应用程序更强大,请参阅这里以供参考。
对于 Linux,有无数工具可用于处理 CSV 文件,但 awk 一定是其中的一把利器。如果可以,请学习 awk,它会让你的生活更轻松。