Pergunta

Eu tenho esse conjunto de dados em um arquivo CSV

1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425 
1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504, 0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644, 0.00078635, 0.000730052, 0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669, 0.00230171, 0.00217917

Como você pode ver, os números são formatados de forma diferente e desalinhado. Existe uma maneira no vim rapidamente alinhar as colunas corretamente, de modo que o resultado é este

1.33570301776,  3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828,  0.010352,   0.0102677,  0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804,  0.0133687,  0.010329,   0.00163437, 0.00191202, 0.0134425 
1.34538754675,  3.3689e-06,  9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504,0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657,  0.0017022, 0.000740644,0.00078635, 0.000730052,0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669,0.00230171, 0.00217917

Isso seria ótimo para copiar e colar seções com ctrl-v. Alguma dica?

Foi útil?

Solução

Se você estiver em algum tipo de UNIX (Linux, etc), você pode enganar e filtrá-la através do comando de coluna (1).

:%!column -t

O acima irá analisar em delimitadores dentro strings literais que é errado, passos para que você provavelmente vai precisar de pré-processamento e especificando o delimitador para este arquivo, por exemplo:

%!sed 's/","/\&/' | column -t -s '&'

Outras dicas

Às vezes queremos alinhar apenas duas colunas. Nesse caso, não precisamos de qualquer plugins e pode usar a funcionalidade Vim pura como esta:

  1. Escolha um separador. No post de OP esta é uma vírgula, no meu exemplo é =.
  2. Adicionar espaços antes / depois. Eu uso s/=/= ...spaces... / na seleção visual para isso.
  3. Localize a palavra mais longa e cursor lugar depois.
  4. Remova todo o espaço em branco extra usando dw e movimento vertical.

Exemplo de esta técnica demonstrada abaixo:

Exemplo

Eu não vejo a necessidade de coisas alinhar muitas vezes suficientes para instalar outro plugin, por isso esta foi a minha maneira preferida de realizá-la -. Especialmente que não requerem muito pensamento

Como sunny256 sugerido, o comando column é uma ótima maneira de fazer isso em máquinas Unix / Linux, mas se você quiser fazê-lo em puro Vim (de modo que ele pode ser usado no Windows também), a maneira mais fácil é para instalar o Align plugin e, em seguida, fazer:

:%Align ,
:%s/\(\s\+\),\s/,\1/g

As primeiras alinha linha as entradas sobre as vírgulas e os segundos se move a vírgula para que seja nivelado com o valor anterior. Você pode ser capaz de usar AlignCtrl definir um mapeamento personalizado que faz todo o lote de uma só vez, mas eu nunca consigo lembrar como usá-lo ...

Editar

Se você não se importa dois espaços entre entradas e você quer fazer isso em um comando, você também pode fazer:

:%Align ,\zs

Esta é uma grande resposta usando macros Vim: https://stackoverflow.com/a/8363786/59384 - basicamente, você começa a gravação de uma macro, formatar a primeira coluna, parar a gravação, em seguida, repetir a macro para todas as linhas restantes.

Copiar / colar a partir desse resposta:

qa0f:w100i <Esc>19|dwjq4@a

Observe o espaço único após o 100i, eo significa "prensa de fuga." - não digite "" literalmente

Tradução:

qa         -- record macro in hotkey a
0          -- go to beginning of line
f:         -- go to first : symbol
w          -- go to next non-space character after the symbol
100i <Esc> -- insert 100 spaces
19|        -- go to 19th column (value 19 figured out manually)
dw         -- delete spaces until : symbol
j          -- go to next line
q          -- stop recording macro
4@a        -- run the macro 4 times (for the remaining 4 lines)

Você pode usar o csv.vim plugin.

:%ArrangeColumn

No entanto, isso não vai fazer exatamente o que você pediu:. Ele será imediatamente ajustar o conteúdo das células, enquanto você tem os seus valores alinhados pelo ponto decimal ou pelo primeiro dígito

O plugin tem muitos outros comandos úteis para trabalhar com arquivos CSV.

Agora, também temos o fabuloso EasyAlign plugin, escrito por junegunn.

Demonstração GIF de seu README:

também se você tem colunas muito longas, pode ser útil para desativar a embalagem padrão

:set nowrap
:%!column -t

(nota no debian você também tem uma opção adicional para -n coluna que se você quer dividir vários delimitadores adjacentes)

pergunta muito velha, mas eu recentemente me aproveitado de uma excelente vim plugin que permite a tabela formatação, quer na mosca ou após o fato, (como o caso de uso requer):

https://github.com/dhruvasagar/vim-table-mode

Eu só escreveu tablign para esta finalidade. Instale com

[sudo -H] pip3 install tablign

Em seguida, basta marcar a tabela no vim e fazer

:'<,'>:!tablign

enter descrição da imagem aqui

Eu escrevi script python que permite aos usuários columize basicamente qualquer tipo de texto também fora do vim. Não tenho certeza se isso vai funcionar para janelas ou usuários de Mac.

columnice.py essência

Uso quando no vim.

:'<,'>!columnice =

Isto irá usar o sinal de igual como o delimitador. O delimitador não é jogado fora embora.

Aqui está uma resposta pura Vim roteiro, há plugins, há macros:

Pode ser mais claro para começar com solução do meu problema como um exemplo. Selecionei as linhas de código que eu queria afetar, em seguida, usou o seguinte comando (lembrar que entrar no modo de comando de modo visual prepends automaticamente o “ '<'>”, por isso age sobre o alcance visual):

:'<,'>g``normal / "value<0d>D70|P`

Só que eu realmente não digite “<0d>”. Você pode inserir caracteres não imprimíveis na linha de comando, pressionando ctrl-v, então a chave que você deseja digitar. “<0d>” é o que é processado na linha de comando depois de eu digitei ‘ctrl-v enter’. Aqui, ele é analisado pelo comando “normal” como a saída do modo de busca “/”. O cursor passa ao “valor” na linha atual.

Então nós simplesmente [D] elete o resto da linha, saltar para a coluna 70 (ou o que você precisa no seu caso), e [P] ut o que acabamos eliminados. Isso significa que temos para determinar a largura da linha mais largo, até a nossa pesquisa. Se você não colocar essa informação em sua linha de status, você pode ver a coluna do cursor digitando o comando modo normal ‘g ctrl-g’. Observe também que saltar a uma coluna que não existe requer a configuração 'virtualedit'!

Eu deixei o termo de pesquisa para o: g de comando (lobal) esvaziar, desde que usamos um bloco visual e queria afetar cada linha, mas você pode deixar fora de usar uma seleção visual (eo “ '<'>” ) e colocar um termo de pesquisa lá em vez disso. Ou combinar uma seleção visual e um termo de pesquisa para as coisas estreitas mais finamente / facilmente.

O Aqui algo que eu aprendi recentemente: Se você fracassar em um comando modo de comando complexa, desfazer com 'u' (se isso afetou o buffer), em seguida, pressione “q” para introduzir um buffer especial história de comando que atua como um tampão convencional. Editar qualquer linha e pressione enter, e o comando alterado é introduzido como um novo comando. Indispensável se você não quer ter de estresse sobre a formulação de tudo perfeitamente da primeira vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top