![¿Cómo ver un archivo de valores separados por delimitadores en Emacs con resaltado útil para leer?](https://rvso.com/image/1303447/%C2%BFC%C3%B3mo%20ver%20un%20archivo%20de%20valores%20separados%20por%20delimitadores%20en%20Emacs%20con%20resaltado%20%C3%BAtil%20para%20leer%3F.png)
¿Cómo ver un archivo de valores separados por delimitadores en Emacs con resaltado útil para leer?
Idealmente, el carácter/cadena delimitador debería ser personalizable.
Si Emacs no puede hacerlo, ¿hay alguna otra herramienta disponible en Linux para esta tarea?
Respuesta1
Respecto a la solución de @Ammar, no es difícil "arreglar" el comando org-table-convert-region
para tomar una expresión regular para el separador, que en este caso podría ser simplemente %%
. Agregué una línea.
(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)))
Desafortunadamente, no se escapa, |
lo cual es muy frustrante para mí, y además no maneja comillas en absoluto. Suponiendo que el delimitador no aparece en una celda, no debería ser difícil escribir una función que la reemplace |
con otra cosa (por ejemplo, \vert{}
si planea exportar a LaTeX, o ⏐, que es el carácter Unicode VERTICAL LINE EXTENSION
) y luego ejecutar el versión modificada de org-table-convert-region
. Incluso podrías reemplazar "%%
y %%"
con %%
si lo deseas. Por supuesto, lo he usado %%
como sustituto de cualquier delimitador que desee (que podría ser un argumento para la función).
Todo depende de la frecuencia con la que vaya a consultar dichos archivos y de las capacidades que necesite para saber cuánto trabajo desea dedicarles. :-)
Respuesta2
En emacs puedes resaltar algún texto con highlight-phrase
( M-s h p
) o highlight-regexp
( M-s h r
).
Respuesta3
Puede cambiar el delimitador a | (por ejemplo, por sed
, pero primero reemplace todos los | por algo más), agregue uno | a cada línea al principio y al final de la línea, luego abra el archivo en emacs en org-mode
.
También puedes usar csv-mode
y su csv-align-fields
.
Respuesta4
Si tiene el modo organización, abra el archivo CSV, establezca el modo principal en modo organización, marque todo el búfer y haga clic en C-|
para transformar el archivo CSV en una tabla en modo organización.
Puede hacer cualquier cosa con las tablas en modo organización, combinado con calc de emacs, es más poderoso que una aplicación de hoja de cálculo, consulteaquípara referencia.
Para Linux, existen infinitas herramientas que puedes usar para procesar archivos CSV, pero la navaja suiza debe estar mal. Aprenda bien si puede, le hará la vida más fácil.