định dạng lại trong vim cho một bố cục cột đẹp


126

Tôi có tập dữ liệu này trong tệp 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

Như bạn có thể thấy, các số được định dạng khác nhau và được sắp xếp sai. Có cách nào trong vim để nhanh chóng căn chỉnh các cột đúng cách, để kết quả là đây

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

Điều đó sẽ rất tuyệt khi sao chép và dán các phần với ctrl-v. Có gợi ý nào không?

Câu trả lời:


263

Nếu bạn đang sử dụng một số loại UNIX (Linux, v.v.), bạn có thể gian lận và lọc nó thông qua lệnh cột (1).

:%!column -t

Ở trên sẽ phân tích các dấu phân cách bên trong chuỗi ký tự sai, vì vậy bạn có thể sẽ cần các bước xử lý trước và chỉ định dấu phân cách cho tệp này chẳng hạn:

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

1
Lệnh tuyệt vời, tôi đã không nhận thức được nó (đã viết kịch bản perl tùy chỉnh để thực hiện loại hoạt động đó trong quá khứ).
hlovdal

24
Bởi vì các tập tin của tôi không có không gian tôi phải sử dụng :%!column -t -s ','. Nó xóa dấu phẩy, vì vậy chúng không còn là tệp csv kỹ thuật nữa. Nhưng sắp xếp chúng thật đẹp, đó là điều tôi cần.
Eduardo

27
Mẹo tuyệt vời! Chỉ cần thêm, nó cũng hoạt động để lựa chọn trực quan với:'<,'>!column -t
freitass

2
Bất cứ ai cũng biết một giải pháp để làm việc với các cột được trích dẫn với dấu phẩy trong cột? ví dụ "2151 Main ST Houston, TX"
metrix 30/12/13

3
@metrix, đây là một cách giải quyết rất vụng về: 1) chuyển đổi không gian bên trong các dấu phân cách thành một ký tự khác, 2) sau đó chạy columnnhư được mô tả trong bài đăng, 3) sau đó thay thế các dấu phân cách của bạn trở lại khoảng trắng. Một lệnh ví dụ trong chế độ trực quan cho bước # 1 là:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Luciano

54

Đôi khi chúng tôi muốn căn chỉnh chỉ hai cột. Trong trường hợp đó, chúng tôi không cần bất kỳ plugin nào và có thể sử dụng chức năng Vim thuần túy như thế này:

  1. Chọn một dải phân cách. Trong bài viết của OP đây là dấu phẩy, trong ví dụ của tôi đây là =.
  2. Thêm khoảng trắng trước / sau nó. Tôi sử dụng s/=/= ...spaces... /trong lựa chọn trực quan cho việc này.
  3. Định vị đến từ dài nhất và đặt con trỏ sau nó.
  4. Xóa tất cả các khoảng trắng thừa bằng cách sử dụng dwvà chuyển động dọc.

Ví dụ về kỹ thuật này được trình bày dưới đây:

Thí dụ

Tôi không thấy mình cần phải sắp xếp mọi thứ đủ thường xuyên để cài đặt một plugin khác, vì vậy đây là cách hoàn thành ưa thích của tôi - đặc biệt là nó không đòi hỏi nhiều suy nghĩ.


4
Làm thế nào bạn làm cho gif tốt đẹp?
Stefano Borini

1
blog.bahraniapps.com/gifcam thật không may, có vẻ như đó là một công cụ chỉ dành cho Windows.
rr-

Khi bạn hoàn thành việc căn chỉnh phần trên, làm thế nào bạn di chuyển con trỏ đến giữa màn hình và sau đó bắt đầu căn chỉnh phần dưới?
cychoi 14/07/2015

5
Sau khi :s/=/ =/sử dụng tốt hơn để Ctrl + Vchọn đúng cột, sau đó căn chỉnh nó bằng cách sử dụng <<.lặp lại. Tìm thấy nó ở đây: stackoverflow.com/a/24704379/2152384
pozitron57

1
Hoặc loại bỏ một macro để thực hiện công việc @ pozitron57
Arthur Julião

24

Như sunny256 đã đề xuất, columnlệnh này là một cách tuyệt vời để thực hiện điều này trên các máy Unix / Linux, nhưng nếu bạn muốn thực hiện nó trong Vim thuần túy (để nó cũng có thể được sử dụng trong Windows), cách dễ nhất là cài đặt Align plugin và sau đó làm:

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

Dòng đầu tiên căn chỉnh các mục trên dấu phẩy và dòng thứ hai di chuyển dấu phẩy sao cho nó phẳng với giá trị trước. Bạn có thể sử dụng AlignCtrlđể xác định ánh xạ tùy chỉnh thực hiện toàn bộ trong một lần, nhưng tôi không bao giờ có thể nhớ cách sử dụng nó ...

Biên tập

Nếu bạn không nhớ hai khoảng trắng giữa các mục và bạn muốn thực hiện điều này trong một lệnh, bạn cũng có thể thực hiện:

:%Align ,\zs

Hoạt động hoàn hảo trong Bảng LaTeX::'<,'>Align &
Thomas

Nó cũng có thể được thực hiện với :%Align! lP0 \s( l= canh lề trái, P0= 0 đệm sau dấu phân cách).
ntd

8

Đây là một câu trả lời tuyệt vời bằng cách sử dụng macro vim: https://stackoverflow.com/a/8363786/59384 - về cơ bản, bạn bắt đầu ghi một macro, định dạng cột đầu tiên, dừng ghi lại sau đó lặp lại macro cho tất cả các dòng còn lại.

Sao chép / dán từ câu trả lời đó:

qa0f:w100i <Esc>19|dwjq4@a

Lưu ý khoảng trống đơn sau 100i và <Esc> có nghĩa là "nhấn thoát" - không nhập "<Esc>" theo nghĩa đen.

Dịch:

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)


7

Bây giờ chúng tôi cũng có plugin EasyAlign tuyệt vời , được viết bởi Junegunn.

GIF trình diễn từ README của nó:


4

Bạn có thể sử dụng plugin csv.vim .

:%ArrangeColumn

Tuy nhiên, điều này sẽ không thực hiện chính xác những gì bạn đã yêu cầu: nó sẽ điều chỉnh đúng nội dung của các ô, trong khi bạn có các giá trị được căn chỉnh theo dấu thập phân hoặc chữ số đầu tiên.

Plugin có nhiều lệnh hữu ích khác để làm việc với các tệp CSV.


3

Ngoài ra, nếu bạn có các cột rất dài, có thể hữu ích để tắt gói mặc định

: đặt ngay bây giờ
:%! cột -t

(lưu ý trong debian, bạn cũng có thêm tùy chọn cho cột -n mà nếu bạn muốn tách nhiều dấu phân cách liền kề)


tốt hơn nhiều với nowrap. Tôi đã bao gồm đề xuất của bạn, cảm ơn 'lệnh CSV được đặt ngay bây giờ | %! cột -t -s ',' `.
Peruz

đồng thời, lưu ý tùy chọn -n để vô hiệu hóa việc hợp nhất các cột trống. stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz

3

Tôi chỉ viết tablign cho mục đích này. Cài đặt với

pip3 install tablign --user

Sau đó, chỉ cần đánh dấu bảng trong vim và làm

:'<,'>:!tablign

nhập mô tả hình ảnh ở đây


1

Câu hỏi khá cũ, nhưng gần đây tôi đã sử dụng một plugin vim tuyệt vời cho phép định dạng bảng ngay cả khi đang di chuyển hoặc sau khi thực tế (như trường hợp sử dụng của bạn yêu cầu):

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


1

Đây là một câu trả lời tập lệnh Vim thuần túy, không có plugin, không có macro:

Có thể rõ ràng nhất để bắt đầu với giải pháp vấn đề của tôi là một ví dụ. Tôi đã chọn các dòng mã mà tôi muốn tác động, sau đó sử dụng lệnh sau (nhớ lại rằng việc nhập chế độ lệnh từ chế độ trực quan sẽ tự động chuẩn bị cho các '', '>>, vì vậy nó hoạt động trên phạm vi hình ảnh):

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

Ngoại trừ tôi KHÔNG thực sự gõ loại <0d>. Bạn có thể nhập các ký tự không thể in trên dòng lệnh bằng cách nhấn ctrl-v, sau đó nhấn phím bạn muốn nhập. Cái <0d> Đây là thứ được hiển thị trên dòng lệnh sau khi tôi gõ 'ctrl-v enter'. Ở đây, nó được phân tích cú pháp bởi lệnh bình thường của Wap như là lối ra từ chế độ tìm kiếm của Cameron /. Sau đó, con trỏ nhảy tới giá trị GIAO trên dòng hiện tại.

Sau đó, chúng tôi chỉ cần [D] xóa phần còn lại của dòng, chuyển đến cột 70 (hoặc bất cứ điều gì bạn cần trong trường hợp của bạn) và [P] ut những gì chúng tôi vừa xóa. Điều này không có nghĩa là chúng tôi phải xác định chiều rộng của đường rộng nhất, tùy theo tìm kiếm của chúng tôi. Nếu bạn chưa đưa thông tin đó vào dòng trạng thái của mình, bạn có thể thấy cột của con trỏ bằng cách nhập lệnh chế độ bình thường 'g ctrl-g'. Cũng lưu ý rằng việc nhảy đến một cột không tồn tại đòi hỏi phải cài đặt 'virtualedit'!

Tôi bỏ trống cụm từ tìm kiếm cho lệnh: g (lobal), vì chúng tôi đã sử dụng một khối trực quan và muốn ảnh hưởng đến mọi dòng, nhưng bạn có thể bỏ qua bằng cách sử dụng một lựa chọn trực quan (và các '', '>') và đặt một thuật ngữ tìm kiếm ở đó thay vào đó. Hoặc kết hợp lựa chọn trực quan và thuật ngữ tìm kiếm để thu hẹp mọi thứ một cách dễ dàng / dễ dàng hơn.

Đây là một điều tôi học được gần đây: nếu bạn làm rối lệnh lệnh chế độ lệnh phức tạp, hãy hoàn tác với 'u' (nếu nó ảnh hưởng đến bộ đệm), sau đó nhấn vào q q: để nhập bộ đệm lịch sử lệnh đặc biệt hoạt động giống như bộ đệm thông thường . Chỉnh sửa bất kỳ dòng nào và nhấn enter, và lệnh đã thay đổi được nhập dưới dạng lệnh mới. Không thể thiếu nếu bạn không muốn phải căng thẳng trong việc xây dựng mọi thứ hoàn hảo ngay lần đầu tiên.


0

Tôi đã viết kịch bản python cho phép người dùng cơ bản tạo ra bất kỳ loại văn bản nào bên ngoài vim. Không chắc chắn nếu điều này sẽ làm việc cho người dùng windows hoặc mac.

chuyên mục

Cách sử dụng khi ở vim.

:'<,'>!columnice =

Điều này sẽ sử dụng dấu bằng như là dấu phân cách. Các đồng hồ đo không được ném đi mặc dù.


0

Tôi có cái này trong .vimrc của tôi.

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

Điều này căn chỉnh các cột trong khi giữ dấu phẩy, có thể cần thiết sau này để đọc chính xác. Ví dụ, với Python Pandas read_csv(..., skipinitialspace=True), cảm ơn các anh chàng Pandas vì tùy chọn thông minh này, nếu không thì trong vim %s/,\s\+/,/g. Tôi có thể dễ dàng hơn nếu bạn columncó tùy chọn - phân tách thông số tôi đoán, tôi không biết và tôi không chắc tại sao (trang người dùng của tôi cho biết năm 2004, trên ubfox 18.04, không chắc chắn ubfox sẽ có phiên bản mới) . Dù sao, điều này làm việc cho tôi, và bình luận nếu bạn có bất kỳ đề nghị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.