2009-09-08 17 views
13

के कॉलम को कैसे कट करें मेरे पास सीएसवी फाइलों (लगभग 250) का एक सेट है, प्रत्येक में 300 से 500 रिकॉर्ड हैं। मुझे प्रत्येक फ़ाइल से 2 या 3 कॉलम कटौती करने और इसे किसी अन्य स्टोर में स्टोर करने की आवश्यकता है। मैं उबंटू ओएस का उपयोग कर रहा हूं। क्या कमांड या उपयोगिता में ऐसा करने का कोई तरीका है?सीएसवी

उत्तर

22

यदि आप जानते हैं कि कॉलम डेलीमीटर फ़ील्ड के अंदर नहीं होता है, तो आप कट का उपयोग कर सकते हैं।

$ cat in.csv 
foo,bar,baz 
qux,quux,quuux 
$ cut -d, -f2,3 < in.csv 
bar,baz 
quux,quuux 

आप सभी इनपुट फ़ाइलों पर 'लूप' के लिए खोल बिल्डिन 'का उपयोग कर सकते हैं।

+2

आप सभी फ़ाइलों को कुछ हद तक संसाधित कर सकते हैं जैसे: "* .csv" ढूंढें। xargs cut -d, -f2,3> out.csv – pixelbeat

+2

यदि आप अल्पविराम से छुटकारा पाने के लिए या इसे किसी अन्य चीज़ में बदलना चाहते हैं तो आप 'कटआउट' के '--output-delimiter = STRING' विकल्प का उपयोग कर सकते हैं। –

+14

इस उत्तर के साथ मुख्य समस्या यह है कि 'कट' उद्धृत फ़ील्ड को संभाल नहीं करता है जिसमें डेलीमीटर शामिल है। यदि आपकी सीएसवी फ़ाइल में डेटा है जो ऐसा करता है, तो आपको कुछ और उपयोग करने की आवश्यकता होगी। –

9

यदि फ़ील्ड में डिलीमीटर हो सकता है, तो आपको एक ऐसी लाइब्रेरी मिलनी चाहिए जो CSV फ़ाइलों को पार्स कर सके। आम तौर पर, सामान्य उद्देश्य स्क्रिप्टिंग भाषाओं में उनके मानक पुस्तकालय में एक CSV मॉड्यूल शामिल होगा।

Ruby: require 'csv' 
Python: import csv 
Perl: use Text::ParseWords; 
8

अपने फ़ील्ड को अल्पविराम या नई-पंक्तियों को शामिल हैं, तो आप एक सहायक कार्यक्रम मैं कटौती (और अन्य यूनिक्स पाठ प्रसंस्करण उपकरण) ठीक से डेटा के साथ काम करने के लिए अनुमति देने के लिए लिखा उपयोग कर सकते हैं।

https://github.com/dbro/csvquote

इस कार्यक्रम उद्धृत क्षेत्रों के अंदर विशेष वर्ण पाता है, और अस्थायी रूप से उन्हें वर्ण जो कटौती कार्यक्रम को भ्रमित नहीं होंगे अमुद्रणीय साथ बदल देता है। फिर कटौती के बाद उन्हें बहाल कर दिया जाता है।

Lutz 'समाधान हो जाएगा:

csvquote in.csv | cut -d, -f2,3 | csvquote -u 
+0

हां यह मेरे लिए बहुत अच्छा काम करता है: https://stackoverflow.com/questions/17199311/how-to-delete-a-column-columns-of-a-csv-file-which-has-cell-values-with -एक-स्ट्रिंग/29134579 # 29134579 – nono

0

यदि आप ssconvert इस्तेमाल किया सीएसवी प्राप्त करने के लिए आप प्रयास कर सकते हैं:

ssconvert -O 'separator="|"' "file.xls" "file.txt" 

सूचना TXT विस्तार बजाय सीएसवी, इस तरह से होगा का उपयोग करें Gnumeric_stf: stf_assistantके बजाय निर्यातक Gnumeric_stf: stf_csv, जो आपको विकल्प (-O पैरामीटर) का उपयोग करने देता है। अन्यथा आपको मिलेगा फ़ाइल सेवर विकल्प त्रुटि नहीं लेता है। पाइप चरित्र अधिक संभावना नहीं है, लेकिन आप पहले जांचना चाहेंगे।

तो फिर तुम इसका नाम बदलना और पसंद कर सकते हैं:

cat file.csv | cut -d "|" -f3 | sort | uniq -c | sort -rn | head 
  • अन्य विकल्प उदाहरण: -O 'eol=unix separator=; format=preserve charset=UTF-8 locale=en_US transliterate-mode=transliterate quoting-mode=never'
  • A solution with AWK v4+
  • ssconvert man page