จัดรูปแบบใหม่เป็นกลุ่มเพื่อการจัดวางคอลัมน์ที่ดี


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

อย่างที่คุณเห็นตัวเลขมีการจัดรูปแบบแตกต่างกันและไม่ตรงแนว มีวิธีใดบ้างในการจัดแนวคอลัมน์อย่างรวดเร็วเพื่อให้ผลลัพธ์เป็นเช่นนี้

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 ฯลฯ ) บางประเภทคุณสามารถโกงและกรองผ่านคำสั่งคอลัมน์ (1)

:%!column -t

ข้างต้นจะแยกวิเคราะห์ตัวคั่นภายในตัวอักษรสตริงซึ่งไม่ถูกต้องดังนั้นคุณอาจต้องใช้ขั้นตอนก่อนการประมวลผลและระบุตัวคั่นสำหรับไฟล์นี้เช่น:

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

1
คำสั่งที่ยอดเยี่ยมฉันไม่รู้ (เคยเขียนสคริปต์ perl ที่กำหนดเองเพื่อดำเนินการแบบนั้นในอดีต)
hlovdal

25
:%!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

1
blog.bahraniapps.com/gifcamน่าเสียดายที่ดูเหมือนว่าจะเป็นเครื่องมือสำหรับ Windows เท่านั้น
rr-

เมื่อคุณจัดตำแหน่งส่วนบนเสร็จแล้วคุณย้ายเคอร์เซอร์ไปตรงกลางหน้าจอได้อย่างไรจากนั้นจึงเริ่มจัดตำแหน่งส่วนล่าง
cychoi

5
หลังจาก:s/=/ =/ใช้Ctrl + Vเพื่อเลือกคอลัมน์ด้านขวาแล้วจะดีกว่ามากจากนั้นจัดแนวโดยใช้<<และ.ทำซ้ำ พบได้ที่นี่: stackoverflow.com/a/24704379/2152384
pozitron57

1
หรือสร้างมาโครเพื่อทำงาน @ pozitron57
Arthur 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> หมายถึง "press escape" - อย่าพิมพ์ "<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

นอกจากนี้หากคุณมีคอลัมน์ที่ยาวมากคุณสามารถปิดการใช้งานการตัดเริ่มต้นได้อย่างสะดวก

: set nowrap
:%! คอลัมน์ -t

(หมายเหตุในเดเบียนคุณยังมีตัวเลือกเพิ่มเติมสำหรับคอลัมน์ -n ซึ่งหากคุณต้องการแยกตัวคั่นที่อยู่ติดกันหลายตัว)


ดีกว่ามากกับ nowrap ฉันรวมคำแนะนำของคุณด้วยขอบคุณ 'command CSV set nowrap | %! คอลัมน์ -t -s ',' '
Peruz

นอกจากนี้โปรดสังเกตตัวเลือก -n เพื่อปิดใช้งานการรวมคอลัมน์ว่าง stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz

3

ฉันเพิ่งเขียนtablignเพื่อจุดประสงค์นี้ ติดตั้งด้วย

pip3 install tablign --user

จากนั้นทำเครื่องหมายตารางเป็นกลุ่มแล้วทำ

:'<,'>:!tablign

ใส่คำอธิบายภาพที่นี่


1

คำถามเก่า ๆ แต่ฉันเพิ่งใช้ประโยชน์จากปลั๊กอิน vim ที่ยอดเยี่ยมที่เปิดใช้งานการจัดรูปแบบตารางทั้งแบบทันทีหรือหลังความจริง (ตามกรณีการใช้งานของคุณต้องการ):

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


1

นี่คือคำตอบของสคริปต์ Vim ที่บริสุทธิ์ไม่มีปลั๊กอินไม่มีมาโคร:

การเริ่มต้นด้วยวิธีแก้ปัญหาของฉันเป็นตัวอย่างที่ชัดเจนที่สุด ฉันเลือกบรรทัดของรหัสที่ฉันต้องการให้มีผลแล้วใช้คำสั่งต่อไปนี้ (จำได้ว่าการเข้าสู่โหมดคำสั่งจากโหมดภาพจะนำหน้า“ '<,'>” โดยอัตโนมัติดังนั้นจึงทำหน้าที่ในช่วงภาพ):

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

ยกเว้นฉันไม่ได้พิมพ์“ <0d>” จริงๆ คุณสามารถป้อนอักขระที่ไม่สามารถพิมพ์ได้ในบรรทัดคำสั่งโดยกด ctrl-v จากนั้นคีย์ที่คุณต้องการพิมพ์ “ <0d>” คือสิ่งที่แสดงในบรรทัดคำสั่งหลังจากที่ฉันพิมพ์ 'ctrl-v enter' ที่นี่จะแยกวิเคราะห์โดยคำสั่ง "ปกติ" เป็นทางออกจากโหมดค้นหา "/" จากนั้นเคอร์เซอร์จะข้ามไปที่“ ค่า” ในบรรทัดปัจจุบัน

จากนั้นเราก็ [D] ลบส่วนที่เหลือของบรรทัดข้ามไปที่คอลัมน์ 70 (หรืออะไรก็ได้ที่คุณต้องการในกรณีของคุณ) และ [P] สิ่งที่เราเพิ่งลบไป นี่หมายความว่าเราต้องกำหนดความกว้างของบรรทัดที่กว้างที่สุดตามการค้นหาของเรา หากคุณไม่ได้ใส่ข้อมูลนั้นในสเตตัสไลน์คุณสามารถดูคอลัมน์ของเคอร์เซอร์ได้โดยป้อนคำสั่งโหมดปกติ "g ctrl-g" โปรดทราบว่าการข้ามไปยังคอลัมน์ที่ไม่มีอยู่นั้นจำเป็นต้องใช้การตั้งค่า 'อัจฉริยะ'!

ฉันปล่อยให้คำค้นหาสำหรับคำสั่ง: g (lobal) ว่างเปล่าเนื่องจากเราใช้บล็อกภาพและต้องการให้มีผลกับทุกบรรทัด แต่คุณสามารถเว้นได้โดยใช้การเลือกภาพ (และ“ '<,'>”) และใส่ ข้อความค้นหาที่นั่นแทน หรือรวมการเลือกภาพและข้อความค้นหาเพื่อ จำกัด สิ่งต่างๆให้ละเอียด / ง่ายขึ้น

นี่คือสิ่งที่ฉันได้เรียนรู้เมื่อเร็ว ๆ นี้: หากคุณทำผิดกับคำสั่งโหมดคำสั่งที่ซับซ้อนให้เลิกทำด้วย 'u' (หากมีผลต่อบัฟเฟอร์) จากนั้นกด "q:" เพื่อป้อนบัฟเฟอร์ประวัติคำสั่งพิเศษที่ทำหน้าที่เหมือนกับบัฟเฟอร์ทั่วไป . แก้ไขบรรทัดใดก็ได้แล้วกด Enter และคำสั่งที่เปลี่ยนแปลงจะถูกป้อนเป็นคำสั่งใหม่ สิ่งที่ขาดไม่ได้หากคุณไม่ต้องการเครียดกับการกำหนดทุกอย่างให้สมบูรณ์แบบในครั้งแรก


0

ฉันเขียนสคริปต์ python ที่ช่วยให้ผู้ใช้สามารถรวบรวมข้อความประเภทใดก็ได้โดยทั่วไปนอกจากนี้ยังอยู่นอกกลุ่ม ไม่แน่ใจว่าจะใช้ได้กับผู้ใช้ windows หรือ mac

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 จะได้รับเวอร์ชันใหม่) . อย่างไรก็ตามสิ่งนี้ใช้ได้กับฉันและแสดงความคิดเห็นหากคุณมีข้อเสนอแนะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.