güzel bir sütun düzeni için vim'de yeniden biçimlendirin


126

Bu veri kümesine bir csv dosyasında sahibim

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

Gördüğünüz gibi, sayılar farklı biçimlendirilmiş ve yanlış hizalanmış. Vim'de sütunları hızlı bir şekilde hizalamanın bir yolu var mı, böylece sonuç bu

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

Bölümleri ctrl-v ile kopyalayıp yapıştırmak harika olurdu. Herhangi bir ipucu?

Yanıtlar:


263

Bir tür UNIX (Linux, vb.) Kullanıyorsanız, sütun (1) komutuyla hile yapabilir ve filtreleyebilirsiniz.

:%!column -t

Yukarıdakiler, dizge değişmezleri içindeki sınırlayıcıları ayrıştıracaktır, bu nedenle büyük olasılıkla ön işleme adımlarına ve bu dosya için sınırlayıcıyı belirtmeye ihtiyacınız olacaktır, örneğin:

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

1
Cool komut, bunun farkında değildim (geçmişte bu tür bir işlemi yapmak için özel perl betiği yazmıştım).
hlovdal

24
Çünkü dosyalarımda kullanmak zorunda olduğum bir alan yoktu :%!column -t -s ','. Virgülleri kaldırır, böylece artık teknik csv dosyaları değildirler. Ama onları güzelce düzenledi, ihtiyacım olan buydu.
Eduardo

27
Harika bir ipucu! :'<,'>!column -t
Eklemek gerekirse

2
Sütunda virgül bulunan alıntılanmış sütunlarla çalışmak için bir çözüm bilen var mı? örnek "2151 Main ST Houston, TX"
metrix

3
@metrix, işte çok beceriksiz bir çözüm: 1) sınırlayıcıların içindeki boşlukları farklı bir karaktere dönüştürün, 2) sonra columnaçıklandığı gibi çalıştırın , 3) sınırlayıcılarınızı tekrar boşluklarla değiştirin. 1. adım için görsel modda örnek bir komut şudur:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Luciano

54

Bazen sadece iki sütunu hizalamak isteriz. Bu durumda, herhangi bir eklentiye ihtiyacımız yoktur ve aşağıdaki gibi saf Vim işlevlerini kullanabiliriz:

  1. Bir ayırıcı seçin. OP'nin gönderisinde bu bir virgül, benim örneğimde bu =.
  2. Önüne / arkasına boşluklar ekleyin. Bunun için s/=/= ...spaces... /görsel seçimde kullanıyorum .
  3. En uzun kelimeyi bulun ve imleci onun arkasına yerleştirin.
  4. dwDikey hareket kullanarak tüm ekstra beyaz boşlukları kaldırın .

Aşağıda gösterilen bu tekniğin örneği:

Misal

Kendimi başka bir eklenti kurmak için işleri yeterince sık hizalamaya ihtiyaç duyarken bulmuyorum, bu yüzden bunu başarmak için tercih ettiğim yol buydu - özellikle de fazla düşünmeyi gerektirmediği için.


4
O güzel gifi nasıl yaptın?
Stefano Borini

1
blog.bahraniapps.com/gifcam maalesef sadece Windows'a yönelik bir araç gibi görünüyor.
rr-

Üst kısmı hizalamayı bitirdiğinizde, imleci ekranın ortasına nasıl hareket ettirdiniz ve ardından alt kısmı hizalamaya nasıl başladınız?
cychoi

5
Sonra :s/=/ =/çok daha iyi kullanmaktır Ctrl + Vsağ sütunu seçmek için, o zaman kullanarak hizalamak <<ve .tekrarına. Burada bulundu: stackoverflow.com/a/24704379/2152384
pozitron57

1
Veya iş yapmak için bir makro oluşturun @ pozitron57
Arthur Julião

24

Sunny256'nın önerdiği gibi, columnkomut bunu Unix / Linux makinelerinde yapmanın harika bir yoludur, ancak bunu saf Vim'de yapmak istiyorsanız (böylece Windows'ta da kullanılabilir), en kolay yol Align'ı kurmaktır. eklenti ve sonra yapın:

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

İlk satır, virgüllerin üzerindeki girişleri hizalar ve ikincisi, virgülü önceki değerle aynı hizada olacak şekilde taşır. Her AlignCtrlşeyi tek seferde yapan özel bir eşleme tanımlamak için kullanabilirsiniz , ancak bunu nasıl kullanacağımı asla hatırlayamıyorum ...

Düzenle

Girişler arasında iki boşluk olmasını istemiyorsanız ve bunu tek bir komutla yapmak istiyorsanız, şunları da yapabilirsiniz:

:%Align ,\zs

LaTeX Masasında mükemmel çalışır::'<,'>Align &
Thomas

Ayrıca :%Align! lP0 \s( l= sola hizalı, P0= ayırıcıdan sonra 0 doldurma) ile de gerçekleştirilebilir.
ntd

8

Bu, vim makrolarını kullanan harika bir cevaptır: https://stackoverflow.com/a/8363786/59384 - temel olarak, bir makro kaydetmeye başlarsınız, ilk sütunu biçimlendirirsiniz, kaydı durdurur ve kalan tüm satırlar için makroyu tekrarlarsınız.

Bu yanıttan kopyalayın / yapıştırın:

qa0f:w100i <Esc>19|dwjq4@a

100i'den sonraki tek boşluğa dikkat edin ve <Esc> "kaçış" anlamına gelir - kelimenin tam anlamıyla "<Esc>" yazmayın.

Tercüme:

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 eklentisini kullanabilirsiniz .

:%ArrangeColumn

Bununla birlikte, bu tam olarak istediğiniz şeyi yapmayacaktır: hücrelerin içeriğini doğru ayarlayacaktır, oysa değerlerinizi ondalık nokta veya ilk basamağa göre hizalayabilirsiniz.

Eklenti, CSV dosyalarıyla çalışmak için birçok yararlı komuta sahiptir.


3

ayrıca çok uzun sütunlarınız varsa, varsayılan kaydırmayı devre dışı bırakmak kullanışlı olabilir

: nowrap ayarla
:%! sütun -t

(debian'da, birden fazla bitişik sınırlayıcıyı bölmek istiyorsanız, -n sütunu için başka bir seçeneğiniz olduğunu da unutmayın)


nowrap ile çok daha iyi. Önerinizi ekledim, teşekkürler 'komutu CSV set nowrap | %! sütun -t -s ', ".
Peruz

ayrıca boş sütunların birleştirilmesini devre dışı bırakmak için -n seçeneğine de dikkat edin. stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz

3

Ben sadece bu amaçla tablign yazdım . İle yükle

pip3 install tablign --user

Ardından tabloyu vim'de işaretleyin ve

:'<,'>:!tablign

görüntü açıklamasını buraya girin



1

İşte saf bir Vim komut dosyası yanıtı, eklenti yok, makro yok:

Örnek olarak benim sorunumun çözümüyle başlamak çok daha açık olabilir. Etkilemek istediğim kod satırlarını seçtim, ardından aşağıdaki komutu kullandım (görsel moddan komut moduna girmenin otomatik olarak “'<,'>” karakterinin başına eklendiğini ve böylece görsel aralıkta etki ettiğini hatırlayın):

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

Ancak aslında "<0d>" yazmadım. Komut satırına ctrl-v tuşlarına ve ardından yazmak istediğiniz tuşa basarak yazdırılamayan karakterler girebilirsiniz. "<0d>", 'ctrl-v enter' yazdıktan sonra komut satırında gösterilen şeydir. Burada, "/" arama modundan çıkış olarak "normal" komutla ayrıştırılır. İmleç daha sonra mevcut satırdaki "değer" e atlar.

Sonra [D] satırın geri kalanını silip, 70. sütuna (veya sizin durumunuzda ihtiyacınız olan her şeye) atlarız ve [P] az önce sildiğimizi çıkarırız. Bu, aramamıza kadar en geniş çizginin genişliğini belirlememiz gerektiği anlamına gelir. Bu bilgiyi durum satırınıza koymadıysanız, 'g ctrl-g' normal mod komutunu girerek imlecin sütununu görebilirsiniz. Ayrıca, var olmayan bir sütuna atlamanın 'virtualedit' ayarını gerektirdiğini unutmayın!

Görsel bir blok kullandığımız ve her satırı etkilemek istediğimiz için: g (lobal) komutu için arama terimini boş bıraktım, ancak görsel bir seçim (ve "'<,'>") kullanarak bırakabilir ve onun yerine bir arama terimi. Veya işleri daha ince / kolay bir şekilde daraltmak için görsel bir seçimi ve bir arama terimini birleştirin.

Son zamanlarda öğrendiğim bir şey var: Karmaşık bir komut modu komutunu karıştırırsanız, 'u' ile geri alın (arabelleği etkilediyse), daha sonra geleneksel bir arabellek gibi davranan özel bir komut geçmişi arabelleğine girmek için "q:" tuşuna basın . Herhangi bir satırı düzenleyin ve enter tuşuna basın, değiştirilen komut yeni bir komut olarak girilir. İlk seferinde her şeyi mükemmel bir şekilde formüle etmek zorunda kalmak istemiyorsanız vazgeçilmezdir.


0

Kullanıcıların vim dışında da herhangi bir metin türünü temelde derlemelerine izin veren python betiği yazdım. Bunun Windows veya Mac kullanıcıları için çalışıp çalışmayacağından emin değilim.

columnice.py özet

Vim içindeyken kullanım.

:'<,'>!columnice =

Bu, eşittir işaretini sınırlayıcı olarak kullanacaktır. Ayırıcı yine de atılmıyor.


0

Bu .vimrc dosyamda var.

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

Bu, virgül tutarken sütunları hizalar ve daha sonra doğru okuma için gerekli olabilir. Örneğin, Python Pandas ile Pandalar read_csv(..., skipinitialspace=True)bu akıllı seçenek için teşekkürler, aksi halde vim %s/,\s\+/,/g. - Çıktı ayırıcıcolumn seçeneğiniz varsa daha kolay olabilir, sanırım, benim yok ve neden emin değilim . Her neyse, bu benim için çalışıyor ve herhangi bir öneriniz varsa yorum yapın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.