एक अच्छा कॉलम लेआउट के लिए विम में सुधार


126

मेरे पास यह डेटासेट एक सीएसवी फाइल में है

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

जैसा कि आप देख सकते हैं, संख्याओं को अलग-अलग रूप में स्वरूपित किया गया है और गलत रूप दिया गया है। क्या स्तंभों को जल्दी से ठीक से संरेखित करने का एक तरीका है, ताकि परिणाम यह हो

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 (लिनक्स, आदि) पर हैं, तो आप इसे (1) कमांड के माध्यम से धोखा दे सकते हैं और फ़िल्टर कर सकते हैं।

:%!column -t

उपरोक्त स्ट्रिंग शाब्दिक के अंदर सीमांकक पर पार्स करेगा जो गलत है, इसलिए आपको पूर्व-प्रसंस्करण चरणों की आवश्यकता होगी और उदाहरण के लिए इस फ़ाइल के लिए सीमांकक निर्दिष्ट करना होगा:

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

1
कूल कमांड, मुझे इसकी जानकारी नहीं थी (अतीत में इस तरह के ऑपरेशन को करने के लिए कस्टम पर्ल स्क्रिप्ट लिखी गई थी)।
hlovdal

24
क्योंकि मेरी फाइलों में जगह नहीं थी जिसका मुझे इस्तेमाल करना था :%!column -t -s ','। यह अल्पविराम को हटा देता है, इसलिए वे अब तकनीकी सीएसवी फाइलें नहीं हैं। लेकिन उन्हें खूबसूरती से व्यवस्थित करता है, जो मुझे चाहिए था।
एडुआर्डो

27
महान टिप! बस जोड़ने, यह दृश्य चयन के लिए भी साथ काम करता है:'<,'>!column -t
freitass

2
किसी को भी कॉलम में कॉमा के साथ उद्धृत कॉलम के साथ काम करने का समाधान पता है? उदाहरण "2151 मेन एसटी ह्यूस्टन, TX"
मेट्रिक्स

3
@ मेट्रिक्स, यहां एक बहुत ही भद्दा वर्कअराउंड है: 1) रिक्त स्थान को एक अलग चरित्र में सीमांकक के अंदर columnबदलें, 2) फिर पोस्ट में वर्णित के रूप में चलाएं , 3) फिर अपने सीमांकक को वापस अंतरिक्ष में बदलें। चरण # 1 के लिए दृश्य मोड में एक उदाहरण कमांड है:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
लुसियानो

54

कभी-कभी हम सिर्फ दो कॉलम संरेखित करना चाहते हैं। उस स्थिति में, हमें किसी भी प्लगइन्स की आवश्यकता नहीं है और इस तरह शुद्ध विम कार्यक्षमता का उपयोग कर सकते हैं:

  1. एक विभाजक चुनें। ओपी की पोस्ट में यह एक अल्पविराम है, मेरे उदाहरण में यह है =
  2. इससे पहले / बाद में रिक्त स्थान जोड़ें। मैं इसके लिए s/=/= ...spaces... /दृश्य चयन में उपयोग करता हूं ।
  3. सबसे लंबे शब्द का पता लगाएँ और इसके बाद कर्सर रखें।
  4. dwऊर्ध्वाधर आंदोलन का उपयोग करके सभी अतिरिक्त व्हाट्सएप निकालें ।

इस तकनीक का उदाहरण नीचे दिखाया गया है:

उदाहरण

मैं खुद को एक और प्लगइन स्थापित करने के लिए अक्सर चीजों को संरेखित करने की आवश्यकता नहीं पाता हूं, इसलिए इसे पूरा करने का मेरा पसंदीदा तरीका था - विशेष रूप से यह कि बहुत सोच की आवश्यकता नहीं है।


4
आपने वह अच्छा gif कैसे बनाया?
स्टेफानो बोरीनी

1
blog.bahraniapps.com/gifcam दुर्भाग्य से, ऐसा लगता है कि यह केवल एक विंडोज-टूल है।
आरआर-

जब आपने ऊपरी भाग को संरेखित करना समाप्त कर दिया, तो आपने कर्सर को स्क्रीन के मध्य में कैसे स्थानांतरित किया और फिर निचले हिस्से को संरेखित करना शुरू किया?
सिकोइ जूल

5
सही स्तंभ का चयन करने के :s/=/ =/लिए उपयोग Ctrl + Vकरने के बाद यह बेहतर है , फिर इसका उपयोग करके <<और .दोहराने के लिए संरेखित करें । यह यहाँ पाया गया: stackoverflow.com/a/24704379/2152384
pozitron57

1
या एक मैक्रो को डी जॉब करने के लिए @ pozitron57
आर्थर जूलियो

24

जैसा कि sunny256 ने सुझाव दिया है, columnकमांड यूनिक्स / लिनक्स मशीनों पर ऐसा करने का एक शानदार तरीका है, लेकिन यदि आप इसे शुद्ध विम में करना चाहते हैं (ताकि इसका उपयोग विंडोज में भी किया जा सके), तो सबसे आसान तरीका यह है कि संरेखित करें प्लगइन और फिर करते हैं:

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

पहली पंक्ति कॉमा पर प्रविष्टियों को संरेखित करती है और दूसरी कॉमा को आगे बढ़ाती है ताकि यह पूर्ववर्ती मान के साथ फ्लश हो जाए। आप AlignCtrlएक कस्टम मैपिंग को परिभाषित करने के लिए उपयोग करने में सक्षम हो सकते हैं जो एक ही बार में बहुत कुछ करता है, लेकिन मुझे यह याद नहीं है कि इसका उपयोग कैसे करें ...

संपादित करें

यदि आप प्रविष्टियों के बीच दो स्थान नहीं रखते हैं और आप इसे एक कमांड में करना चाहते हैं, तो आप यह भी कर सकते हैं:

:%Align ,\zs

पूरी तरह से एक लाटेक्स तालिका में काम करता है::'<,'>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)


7

हम अब भी शानदार है EasyAlign प्लगइन, junegunn ने लिखा है।

इसकी README से प्रदर्शन GIF:


4

आप csv.vim प्लगइन का उपयोग कर सकते हैं ।

:%ArrangeColumn

हालांकि, यह वही नहीं करेगा जो आपने पूछा है: यह कोशिकाओं की सामग्री को सही समायोजित करेगा, जबकि आपके पास दशमलव बिंदु या पहले अंक द्वारा गठबंधन किए गए आपके मान हैं।

CSV फ़ाइलों के साथ काम करने के लिए प्लगइन में कई अन्य उपयोगी कमांड हैं।


3

यहां तक ​​कि अगर आपके पास बहुत लंबे कॉलम हैं तो डिफ़ॉल्ट रैपिंग को निष्क्रिय करना आसान हो सकता है

: अब सेट करें
:%! कॉलम -t

(ध्यान दें डेबियन में आपके पास कॉलम -n का एक और विकल्प है, जो यदि आप कई आसन्न सीमांकक को विभाजित करना चाहते हैं)


Nowrap के साथ बहुत बेहतर है। मैंने आपके सुझाव को शामिल किया, धन्यवाद 'कमांड CSV सेट Nowrap | %! कॉलम -t -s ',' `।
पेरुज

इसके अलावा, खाली कॉलम के विलय को अक्षम करने के लिए एक एन विकल्प पर ध्यान दें। stackoverflow.com/questions/1875305/command-line-csv-viewer
पेरुज

3

मैंने सिर्फ इस उद्देश्य के लिए सारणीबद्ध लिखा है । के साथ स्थापित करें

pip3 install tablign --user

तो बस तालिका को विम में चिह्नित करें और करें

:'<,'>:!tablign

यहाँ छवि विवरण दर्ज करें


1

बहुत पुराना सवाल है, लेकिन मैंने हाल ही में अपने आप को एक उत्कृष्ट विम प्लगइन का लाभ उठाया है, जो तालिका को फ़्लाईट या आफ्टर-फैक्ट के रूप में सक्षम बनाता है (जैसा कि आपके उपयोग के मामले में आवश्यक है):

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


1

यहाँ एक शुद्ध विम स्क्रिप्ट उत्तर, कोई प्लगइन्स, कोई मैक्रोज़ नहीं है:

एक उदाहरण के रूप में मेरी समस्या के समाधान के साथ शुरुआत करना सबसे स्पष्ट हो सकता है। मैंने उस कोड की पंक्तियों का चयन किया जिसे मैं प्रभावित करना चाहता था, फिर निम्न कमांड का उपयोग करें (याद रखें कि दृश्य मोड से कमांड मोड में प्रवेश करने से स्वचालित रूप से "'<,'>" प्रीपेन्ड हो जाता है, इसलिए यह विज़ुअल रेंज पर कार्य करता है):

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

सिवाय मैंने वास्तव में "<0d>" टाइप नहीं किया। आप ctrl-v दबाकर कमांड लाइन पर अनपेक्षित वर्ण दर्ज कर सकते हैं, फिर वह कुंजी जिसे आप टाइप करना चाहते हैं। "<0d>" वह है जो मैंने 'ctrl-v enter' टाइप करने के बाद कमांड लाइन पर प्रदान किया है। यहां, इसे "सामान्य" कमांड द्वारा "/" खोज मोड से बाहर निकलने के रूप में देखा जाता है। कर्सर तब वर्तमान लाइन में "मान" पर कूदता है।

तब हम बस [D] शेष पंक्ति को हटाते हैं, कॉलम 70 पर जाएं (या आपके मामले में आपको जो भी चाहिए), और [P] जो हमने अभी-अभी डिलीट किया है। इसका मतलब है कि हमें अपनी खोज तक, सबसे चौड़ी लाइन की चौड़ाई निर्धारित करनी होगी। यदि आपने अपनी स्थिति में वह जानकारी नहीं डाली है, तो आप सामान्य मोड कमांड 'g ctrl-g' दर्ज करके कर्सर का कॉलम देख सकते हैं। यह भी ध्यान दें कि जो कॉलम मौजूद नहीं है, उस पर कूदने के लिए सेटिंग 'virtualedit' की आवश्यकता होती है!

मैंने खोज शब्द को छोड़ दिया: g (lobal) कमांड खाली, क्योंकि हमने एक विजुअल ब्लॉक का इस्तेमाल किया था और हर लाइन को प्रभावित करना चाहता था, लेकिन आप विजुअल सिलेक्शन (और "<<, '>") और पुट का उपयोग कर छोड़ सकते हैं इसके बजाय एक खोज शब्द। या एक दृश्य चयन और एक खोज शब्द को और अधिक बारीक / आसानी से संकीर्ण करने के लिए संयोजित करें।

यहां मैंने हाल ही में कुछ सीखा है: यदि आप एक जटिल कमांड मोड कमांड पर गड़बड़ करते हैं, तो 'यू' के साथ पूर्ववत करें (यदि यह बफर को प्रभावित करता है), तो एक विशेष कमांड इतिहास बफर दर्ज करने के लिए "q:" दबाएं जो पारंपरिक बफर की तरह काम करता है । किसी भी लाइन को संपादित करें और एंटर दबाएं, और परिवर्तित कमांड को एक नए कमांड के रूप में दर्ज किया गया है। अपरिहार्य यदि आप नहीं चाहते हैं कि पहली बार पूरी तरह से सब कुछ तैयार करने पर जोर दिया जाए।


0

मैंने पायथन लिपि लिखी है जो उपयोगकर्ताओं को किसी भी प्रकार के पाठ को बेतरतीब ढंग से अलग करने की अनुमति देती है। सुनिश्चित नहीं है कि यह विंडोज़ या मैक उपयोगकर्ताओं के लिए काम करेगा।

columnice.py

जब प्रयोग करें।

:'<,'>!columnice =

यह बराबर चिह्न का उपयोग परिधि के रूप में करेगा। हालांकि परिधि को दूर नहीं फेंका गया है।


0

मेरे पास मेरे .vimrc में है।

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

यह अल्पविराम रखते हुए कॉलम संरेखित करता है, जिसे बाद में सही पढ़ने के लिए आवश्यक हो सकता है। उदाहरण के लिए, पायथन पंडों के साथ read_csv(..., skipinitialspace=True), पंडों लोगों को इस स्मार्ट विकल्प के लिए धन्यवाद, अन्यथा विम में %s/,\s\+/,/g। यह आसान हो सकता है यदि आपके columnपास विकल्प है - ऑउटपुट-सेपरेटर मुझे लगता है, मेरा नहीं है और मुझे यकीन नहीं है कि क्यों (कॉलम के लिए मेरा आदमी पृष्ठ 2004 में ubuntu 18.04 पर कहता है, निश्चित नहीं है कि ubuntu को एक नया संस्करण मिलेगा) । वैसे भी, यह मेरे लिए काम करता है, और यदि आपके कोई सुझाव हैं तो टिप्पणी करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.