멋진 열 레이아웃을 위해 vim에서 다시 형식화


126

이 데이터 세트는 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

보시다시피 숫자는 형식이 다르고 잘못 정렬되어 있습니다. vim에 열을 신속하게 정렬하는 방법이 있습니까?

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

ctrl-v로 섹션을 복사하여 붙여 넣는 것이 좋습니다. 힌트가 있습니까?

답변:


263

어떤 종류의 UNIX (Linux 등)를 사용하는 경우 column (1) 명령을 통해 속이고 필터링 할 수 있습니다.

:%!column -t

위의 내용은 잘못된 문자열 리터럴 내의 구분 기호를 구문 분석하므로 사전 처리 단계와이 파일의 구분 기호를 지정해야 할 수 있습니다. 예를 들면 다음과 같습니다.

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

1
멋진 명령, 나는 그것을 알지 못했습니다 (과거에는 그런 종류의 작업을 수행하기 위해 사용자 정의 펄 스크립트를 작성했습니다).
hlovdal

24
내 파일에 공간이 없었기 때문에 :%!column -t -s ','. 쉼표를 제거하므로 더 이상 기술적 인 csv 파일이 아닙니다. 그러나 그것들을 아름답게 배열하는데 그것이 내가 필요로하는 것입니다.
Eduardo

27
좋은 팁! 추가하기 만하면 시각적 선택에도 적용됩니다.:'<,'>!column -t
freitass

2
열에 쉼표가있는 인용 열로 작업하는 솔루션을 아는 사람이 있습니까? 예 : "2151 Main ST Houston, TX"
metrix

3
@metrix, 여기 매우 서투른 해결 방법이 있습니다. 1) 구분 기호 내부의 공백을 다른 문자로 변환하고 2) column게시물에 설명 된대로 실행 한 다음 3) 구분 기호를 다시 공백으로 바꿉니다. 1 단계에 대한 시각 모드의 명령 예는 다음과 같습니다.'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Luciano

54

때로는 두 개의 열만 정렬하고 싶습니다. 이 경우 플러그인이 필요하지 않으며 다음과 같은 순수한 Vim 기능을 사용할 수 있습니다.

  1. 구분자를 선택하십시오. OP의 게시물에서 이것은 쉼표이며 내 예에서는 =.
  2. 앞 / 뒤에 공백을 추가하십시오. 나는 이것을 위해 s/=/= ...spaces... /시각적 선택에 사용합니다.
  3. 가장 긴 단어를 찾아 그 뒤에 커서를 놓습니다.
  4. dw및 수직 이동을 사용하여 추가 공백을 모두 제거하십시오 .

아래에 설명 된이 기술의 예 :

예

다른 플러그인을 설치하기에 충분할만큼 자주 정렬 할 필요가 없기 때문에 이것이 제가 선호하는 방법이었습니다. 특히 많은 생각이 필요하지 않습니다.


4
어떻게 그 멋진 gif를 만들었나요?
Stefano Borini 2015

1
blog.bahraniapps.com/gifcam은 안타깝게도 Windows 전용 도구 인 것 같습니다.
rr-

상단 정렬이 끝났을 때 커서를 화면 중앙으로 이동 한 다음 하단 정렬을 시작하는 방법은 무엇입니까?
cychoi

5
오른쪽 열을 선택하는 :s/=/ =/데 사용하는 것이 훨씬 더 나은 후 및 Ctrl + V사용하여 정렬하고 반복하십시오. 여기에서 찾았습니다 : stackoverflow.com/a/24704379/2152384<<.
pozitron57

1
또는 pozitron57 @ 드 작업을 수행하는 매크로를 creaete
아서 Julião

24

sunny256이 제안했듯이이 column명령은 Unix / Linux 시스템에서이 작업을 수행하는 좋은 방법이지만 순수한 Vim에서 수행하려는 경우 (Windows에서도 사용할 수 있도록) 가장 쉬운 방법은 Align 을 설치하는 것입니다. 플러그인 후 다음을 수행하십시오.

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

첫 번째 줄은 쉼표의 항목을 정렬하고 두 번째 줄은 쉼표를 이동하여 이전 값과 같은 높이가되도록합니다. AlignCtrl한 번에 모든 작업을 수행하는 사용자 지정 매핑을 정의하는 데 사용할 수 있지만 사용 방법을 기억할 수 없습니다.

편집하다

항목 사이에 두 개의 공백이 있어도 상관없고 하나의 명령에서이 작업을 수행하려면 다음을 수행 할 수도 있습니다.

:%Align ,\zs

LaTeX의 표에서 완벽하게 작동합니다 ::'<,'>Align &
토마스

:%Align! lP0 \s( l= 왼쪽 정렬, P0= 구분 기호 뒤에 0 패딩)을 사용하여 수행 할 수도 있습니다 .
ntd

8

이 사용 훌륭한 답변입니다 정력 매크로 : https://stackoverflow.com/a/8363786/59384 - 기본적으로 매크로 기록을 시작, 첫 번째 열을 포맷, 정지 녹화 후 남아있는 모든 라인에 대한 매크로를 반복합니다.

해당 답변에서 복사 / 붙여 넣기 :

qa0f:w100i <Esc>19|dwjq4@a

100i 뒤에 공백이 하나 있고 <Esc>는 "이스케이프 누르기"를 의미합니다. 문자 그대로 "<Esc>"를 입력하지 마십시오.

번역:

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)



4

csv.vim 플러그인을 사용할 수 있습니다 .

:%ArrangeColumn

그러나 이것은 당신이 요구 한 것과 정확히 일치하지 않을 것입니다. 그것은 셀의 내용을 올바르게 조정하는 반면 당신은 소수점 또는 첫 번째 숫자로 값을 정렬합니다.

플러그인에는 CSV 파일 작업에 유용한 다른 많은 명령이 있습니다.


3

또한 매우 긴 열이있는 경우 기본 줄 바꿈을 비활성화하는 것이 편리 할 수 ​​있습니다.

: nowrap 설정
: %! 열 -t

(데비안에서는 인접한 여러 구분 기호를 분할하려는 경우 열 -n에 대한 추가 옵션도 있습니다)


Nowrap이 훨씬 좋습니다. 당신의 제안을 포함 시켰습니다. 감사합니다. 'command CSV set nowrap | %! column -t -s ','`.
Peruz

또한 빈 열 병합을 비활성화하려면 -n 옵션을 참고하십시오. stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz

3

이 목적을 위해 타 블린 을 썼습니다 . 설치

pip3 install tablign --user

그런 다음 vim에서 테이블을 표시하고

:'<,'>:!tablign

여기에 이미지 설명 입력



1

다음은 순수한 Vim 스크립트 답변, 플러그인, 매크로 없음입니다.

예를 들어 내 문제의 솔루션으로 시작하는 것이 가장 분명 할 수 있습니다. 영향을주고 자하는 코드 줄을 선택한 다음 다음 명령을 사용했습니다 (시각적 모드에서 명령 모드를 입력하면 자동으로 " '<,'>"가 추가되므로 시각 범위에서 작동 함).

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

실제로 "<0d>"를 입력하지 않은 경우를 제외하고. Ctrl-v를 누른 다음 입력하려는 키를 눌러 명령 줄에 인쇄 할 수없는 문자를 입력 할 수 있습니다. "<0d>"는 'ctrl-v enter'를 입력 한 후 명령 줄에 렌더링되는 것입니다. 여기서는 "/"검색 모드의 종료로 "normal"명령에 의해 구문 분석됩니다. 그런 다음 커서는 현재 줄의 "값"으로 이동합니다.

그런 다음 나머지 줄을 [삭제]하고 70 열 (또는 귀하의 경우에 필요한 모든 항목)으로 이동 한 다음 방금 삭제 한 내용을 [P] 입력합니다. 이것은 우리가 검색 할 때까지 가장 넓은 선의 너비를 결정해야 함을 의미합니다. 상태 표시 줄에 해당 정보를 입력하지 않은 경우 일반 모드 명령 'g ctrl-g'를 입력하여 커서 열을 볼 수 있습니다. 또한 존재하지 않는 열로 이동하려면 'virtualedit'설정이 필요합니다!

시각적 블록을 사용하고 모든 줄에 영향을 미치고 싶었 기 때문에 : g (lobal) 명령에 대한 검색어를 비워 두었지만 시각적 선택 (및 " '<,'>")을 사용하여 생략하고 대신 검색어를 입력합니다. 또는 시각적 선택과 검색어를 결합하여 더 세밀하고 / 쉽게 범위를 좁힐 수 있습니다.

내가 최근에 배운 내용은 다음과 같습니다. 복잡한 명령 모드 명령을 엉망으로 만든 경우 'u'(버퍼에 영향을주는 경우)로 실행 취소 한 다음 "q :"를 눌러 기존 버퍼와 매우 유사한 특수 명령 히스토리 버퍼를 입력합니다. . 아무 줄이나 편집하고 Enter 키를 누르면 변경된 명령이 새 명령으로 입력됩니다. 처음에 모든 것을 완벽하게 공식화하는 것에 대해 스트레스를 받고 싶지 않다면 필수 불가결합니다.


0

사용자가 기본적으로 vim 외부에서도 모든 유형의 텍스트를 열람 할 수있는 파이썬 스크립트를 작성했습니다. 이것이 Windows 또는 Mac 사용자에게 작동하는지 확실하지 않습니다.

columnice.py 요점

vim에서 사용.

:'<,'>!columnice =

구분 기호로 등호를 사용합니다. 구분선은 버려지지 않습니다.


0

내 .vimrc에 있습니다.

command! CSV set nowrap | %s/,/,|/g | %!column -n -t -s "|" 

이렇게하면 나중에 올바른 읽기를 위해 필요할 수있는 쉼표를 유지하면서 열이 정렬됩니다. 예를 들어 Python Pandas read_csv(..., skipinitialspace=True)를 사용하면이 스마트 옵션에 대해 Pandas 녀석에게 감사 %s/,\s\+/,/g합니다. 그렇지 않으면 vim 입니다. --output-separatorcolumn 옵션이 있으면 더 쉬울 수 있습니다 . 내 생각에는 그렇지 않습니다. 그 이유는 확실하지 않습니다. . 어쨌든 이것은 나를 위해 작동하며 제안 사항이 있으면 의견을 말하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.