Como visualizar um arquivo de valores separados por delimitador no Emacs com destaque útil para leitura?

2

Como visualizar um arquivo de valores separados por delimitador no Emacs com destaque útil para leitura?

Idealmente, o caractere delimitador / string deve ser personalizável.

Se o Emacs não pode fazer alguma outra ferramenta disponível no Linux para esta tarefa?

    
por qazwsx 31.01.2012 / 15:56

4 respostas

2

Sobre a solução de @ Ammar Não é difícil "consertar" o comando org-table-convert-region para ter uma expressão regular para o separador, que neste caso poderia ser apenas %% . Eu adicionei uma linha.

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

Infelizmente, não é possível escapar de | , o que é muito frustrante para mim e também não lida com as cotações. Supondo que o delimitador não apareça em uma célula, não deve ser difícil escrever uma função que substituirá | por outra coisa (por exemplo, \vert{} se você planeja exportar para o LaTeX ou ⏐ que é o unicode caractere VERTICAL LINE EXTENSION ) e, em seguida, execute a versão modificada de org-table-convert-region . Você pode até mesmo substituir "%% e %%" por %% , se desejar. É claro que usei %% como suporte para qualquer delimitador que você queira (o que poderia ser um argumento para a função).

Tudo depende da frequência com que você está vendo esses arquivos e de quais recursos você precisa saber quanto trabalho deseja colocar nele. : -)

    
por 06.02.2012 / 14:28
1

No emacs, você pode destacar algum texto com highlight-phrase ( M-s h p ) ou highlight-regexp ( M-s h r ).

    
por 31.01.2012 / 19:37
0

Você pode alterar o delimitador para | (por exemplo, por sed , mas primeiro substitua todos os outros por), adicione um | para cada início de linha e fim de linha, abra o arquivo no emacs em org-mode .

Você também pode usar csv-mode e seu csv-align-fields .

    
por 31.01.2012 / 19:02
0

Se você tiver o modo de organização, abra o arquivo CSV, defina o modo principal como modo de organização, marque todo o buffer e clique em C-| para transformar o arquivo CSV em uma tabela de modo organizacional.

Você pode fazer qualquer coisa em tabelas de modo organizativo, combinadas com o calc do emacs, é mais poderoso que um aplicativo de planilha, veja aqui para referência.

Para o linux, existem infinitas ferramentas que você pode usar para processar arquivos CSV, mas a faca swiss deve ser awk. Aprenda o awk, se puder, isso facilitará sua vida.

    
por 31.01.2012 / 19:38