सीएसवी फ़ाइलों को संसाधित करने के लिए एक मजबूत कमांड लाइन उपकरण है?


47

मैं सीएसवी फाइलों के साथ काम करता हूं और कभी-कभी कमांड लाइन से एक पंक्ति या स्तंभ की सामग्री को जल्दी से जांचने की आवश्यकता होती है। कई मामलों cutमें head, tailऔर, दोस्त काम करेंगे; हालाँकि, कटौती आसानी से ऐसी स्थितियों से नहीं निपट सकती है

"this, is the first entry", this is the second, 34.5

यहाँ, पहला अल्पविराम पहले क्षेत्र का हिस्सा है, लेकिन cut -d, -f1असहमत है। इससे पहले कि मैं खुद एक समाधान लिखूं, मैं सोच रहा था कि क्या किसी को एक अच्छे उपकरण के बारे में पता है जो इस नौकरी के लिए पहले से मौजूद है। यह, बहुत कम से कम, ऊपर दिए गए उदाहरण को संभालने और एक CSV स्वरूपित फ़ाइल से एक कॉलम वापस करने में सक्षम होगा। अन्य वांछनीय विशेषताओं में पहली पंक्ति में दिए गए स्तंभ नामों के आधार पर स्तंभों का चयन करने की क्षमता, अन्य उद्धरण शैलियों के लिए समर्थन और टैब-अलग फ़ाइलों के लिए समर्थन शामिल हैं।

यदि आप इस तरह के एक उपकरण के बारे में नहीं जानते हैं, लेकिन बैश, पर्ल, या पायथन, या अन्य सामान्य स्क्रिप्टिंग भाषाओं में इस तरह के कार्यक्रम को लागू करने के बारे में सुझाव हैं, तो मुझे ऐसे सुझावों पर कोई आपत्ति नहीं होगी।

जवाबों:


38

आप पायथन के csvमॉड्यूल का उपयोग कर सकते हैं ।

एक सरल उदाहरण:

import csv
reader = csv.reader(open("test.csv", "r"))
for row in reader:
    for col in row:
        print col

मेरा अंतिम हल अजगर में था क्योंकि मेरा पर्ल बहुत जंग खा गया था। धन्यवाद।
स्टीवन डी

2
और भी बेहतर, पंडों का उपयोग करें । यह स्पष्ट रूप से सारणीबद्ध डेटा के साथ काम करने के लिए डिज़ाइन किया गया है।
जोश

38

मुझे शायद थोड़ा बहुत देर हो गई है, लेकिन उल्लेख के लायक एक और उपकरण है: csvkit

http://csvkit.readthedocs.org/

इसमें बहुत सारी कमांड लाइन उपकरण हैं जो कर सकते हैं:

  • CSV फ़ाइलों में सुधार,
  • CSV से और विभिन्न प्रारूपों (JSON, SQL, XLS) से परिवर्तित करें,
  • के बराबर cut, grep, sortऔर दूसरों को, लेकिन सीएसवी-अवगत,
  • विभिन्न CSV फ़ाइलों में शामिल हों,
  • CSV फ़ाइलों के डेटा पर सामान्य SQL क्वेरी करें।

6
एक उत्कृष्ट उपकरण जो प्रश्न मानदंड को आश्चर्यजनक रूप से पूरा करता है (विशेष रूप से इसे एक प्रोग्रामिंग भाषा में कूदने की आवश्यकता नहीं है और अन्य यूनिक्स उपयोगिताओं के साथ फिट होने के लिए अच्छी तरह से तैयार किया गया है)।
mm2001

15

पर्ल के साथ नौकरी के लिए लगता है Text::CSV

perl -MText::CSV -pe '
    BEGIN {$csv = Text::CSV->new();}
    $csv->parse($_) or die;
    @fields = $csv->fields();
    print @fields[1,3];
'

स्तंभ नामों को कैसे प्रबंधित करें, इसके लिए दस्तावेज़ देखें। विभाजक और उद्धरण शैली को मापदंडों के साथ ट्यून किया जा सकता है newText::CSV::Separatorविभाजक अनुमान लगाने के लिए भी देखें ।


वहाँ एक लाइनर आप में यह कॉम्पैक्ट कर सकते हैं। मुझे यह पसंद है, लेकिन केवल जब मैं इसे स्क्रिप्ट के बजाय सीधे कमांड लाइन से लागू कर सकता हूं
श्रीधर सरनोबत

2
@ user7000, जब तक कि आपका शेल यह नहीं है (t)cshकि कमांड आपके शेल के प्रॉम्प्ट पर ठीक काम करेगा। आप हमेशा उन लाइनों को एक साथ जोड़ सकते हैं यदि आप इसे एक लाइन पर चाहते हैं। न्यूलाइन आम तौर पर सी। की तरह पर्ल सिंटैक्स में जगह की तरह होता है
स्टीफन चेज़लस

मेरा अनुमान। हालांकि 1 में 2 से अधिक लाइनों को स्क्वीज़ करना वास्तव में एक लाइनर से मेरा मतलब नहीं है। मैं उम्मीद कर रहा था कि कुछ संश्लिष्ट चीनी होती है जो इसमें से कुछ अंतर्निहित रूप से करेंगे (जैसे कि -eएक अंतर्निहित लूप कैसे बनता है)।
श्रीधर सरनोबत

10

मैंने csvfix पाया है, एक कमांड लाइन टूल काम को अच्छी तरह से करता है। हालांकि आपको इसे स्वयं बनाना होगा:

http://neilb.bitbucket.org/csvfix

यह उन सभी चीजों को करता है जिनकी आप अपेक्षा करते हैं, ऑर्डर / सेलेक्ट कॉलम, स्प्लिट / मर्ज करते हैं और कई आप CSV डेटा से SQL इंसर्ट जनरेट करना और CSV डेटा को अलग करना पसंद नहीं करेंगे।


8

यदि आप कमांड-लाइन का उपयोग करना चाहते हैं (और काम करने के लिए एक संपूर्ण प्रोग्राम नहीं बनाते हैं), तो आप पंक्तियों का उपयोग करना चाहते हैं , एक प्रोजेक्ट जिस पर मैं काम कर रहा हूं: यह एक कमांड-लाइन इंटरफ़ेस है सारणीबद्ध डेटा पर भी अपने कार्यक्रमों में उपयोग करने के लिए एक पायथन लाइब्रेरी। कमांड-लाइन इंटरफ़ेस के साथ आप CSV, XLS, XLSX, HTML या लाइब्रेरी द्वारा समर्थित किसी अन्य सारणीबद्ध प्रारूप में किसी साधारण कमांड के साथ किसी भी डेटा को प्रिंट कर सकते हैं:

rows print myfile.csv

अगर myfile.csvऐसा है:

state,city,inhabitants,area
RJ,Angra dos Reis,169511,825.09
RJ,Aperibé,10213,94.64
RJ,Araruama,112008,638.02
RJ,Areal,11423,110.92
RJ,Armação dos Búzios,27560,70.28

तब पंक्तियाँ इस तरह से सुंदर तरीके से सामग्री को प्रिंट करेंगी:

+-------+-------------------------------+-------------+---------+
| state |              city             | inhabitants |   area  |
+-------+-------------------------------+-------------+---------+
|    RJ |                Angra dos Reis |      169511 |  825.09 |
|    RJ |                       Aperibé |       10213 |   94.64 |
|    RJ |                      Araruama |      112008 |  638.02 |
|    RJ |                         Areal |       11423 |  110.92 |
|    RJ |            Armação dos Búzios |       27560 |   70.28 |
+-------+-------------------------------+-------------+---------+

स्थापित कर रहा है

यदि आप एक पायथन डेवलपर हैं और पहले से ही pipअपनी मशीन पर स्थापित कर चुके हैं , तो बस एक virtualenv के साथ या अंदर चलाएं sudo:

pip install rows

यदि आप डेबियन का उपयोग कर रहे हैं:

sudo apt-get install rows

अन्य शांत सुविधाएँ

परिणत स्वरूप

आप किसी भी समर्थित प्रारूप के बीच परिवर्तित कर सकते हैं:

rows convert myfile.xlsx myfile.csv

क्वेरी

हाँ, आप SQL को CSV फ़ाइल में उपयोग कर सकते हैं:

$ rows query 'SELECT city, area FROM table1 WHERE inhabitants > 100000' myfile.csv
+----------------+--------+
|      city      |  area  |
+----------------+--------+
| Angra dos Reis | 825.09 |
|       Araruama | 638.02 |
+----------------+--------+

स्टडआउट के बजाय क्वेरी के आउटपुट को फ़ाइल में कनवर्ट करना भी --outputपैरामीटर का उपयोग करके संभव है ।

पायथन लाइब्रेरी के रूप में

आप अपने पायथन कार्यक्रमों में भी शामिल हो सकते हैं:

import rows
table = rows.import_from_csv('myfile.csv')
rows.export_to_txt(table, 'myfile.txt')
# `myfile.txt` will have same content as `rows print` output

आशा हैं आप इसका आनंद ले!


6

आर मेरी पसंदीदा प्रोग्रामिंग भाषा नहीं है, लेकिन यह इस तरह की चीजों के लिए अच्छा है। अगर आपकी csv फाइल है

***********
foo.csv
***********
 col1, col2, col3
"this, is the first entry", this is the second, 34.5
'some more', "messed up", stuff

R इंटरप्रेटर टाइप के अंदर

> x=read.csv("foo.csv", header=FALSE)

> x
                     col1                col2   col3
1 this, is the first entry  this is the second   34.5
2              'some more'           messed up  stuff
> x[1]  # first col
                      col1
1 this, is the first entry
2              'some more'
> x[1,] # first row
                      col1                col2  col3
1 this, is the first entry  this is the second  34.5

आपके अन्य अनुरोधों के संबंध में, "पहली पंक्ति में दिए गए कॉलम नामों के आधार पर कॉलम का चयन करने की क्षमता" के लिए

> x["col1"]
                      col1
1 this, is the first entry
2              'some more'

"अन्य उद्धरण शैलियों के लिए समर्थन" के quoteलिए read.csv (और संबंधित फ़ंक्शन) का तर्क देखें । "टैब से अलग की गई फ़ाइलों के लिए समर्थन" के sepलिए read.csv का तर्क देखें ( sep't' पर सेट करें)।

अधिक जानकारी के लिए ऑन लाइन सहायता लें।

> help(read.csv)

मैं R से बहुत परिचित हूं, लेकिन मेरा लक्ष्य कुछ ऐसा था जिसे मैं बैश से आसानी से उपयोग कर सकता था।
स्टीवन डी

1
@ सीन: आर को आसानी से कमांड लाइन से चलाया जा सकता है, ठीक उसी तरह जैसे पायथन या पर्ल, अगर यह आपकी एकमात्र चिंता है। देखें Rscript(बेस आर वितरण का हिस्सा) या एडऑन पैकेज littler। आप कर सकते हैं #!/usr/bin/env Rscriptया समान।
फहीम मीठा

आह येस। मैं आर में बहुत कुशल हूं, लेकिन इस प्रकार की उपयोगिता बनाने के लिए इसका ज्यादा इस्तेमाल नहीं किया है। मेरे पास पायथन में कुछ काम है लेकिन मैं आर में भी कुछ बनाने की कोशिश कर सकता हूं।
स्टीवन डी


4

CSV (हेडर के साथ) सहित नाम-आधारित डेटा में हेरफेर करने के लिए मिलर एक और अच्छा साधन है। CSV फ़ाइल के पहले कॉलम को निकालने के लिए, इसके नाम की परवाह किए बिना, आप कुछ ऐसा करेंगे

printf '"first,column",second,third\n1,2,3\n' |
  mlr --csv --implicit-csv-header --headerless-csv-output cut -f 1

मिलर बहुत प्रभावशाली है। मैं इसकी तुलना करना चाहता हूँ awk, लेकिन अत्यधिक DSV- जागरूक।
डेरेक महार

3

या, आप कुछ अजीब जादू की कोशिश कर सकते हैं । हॉवेर, मैं एक अच्छा awk उपयोगकर्ता नहीं हूं और यह पुष्टि नहीं कर सकता कि यह ठीक से काम करेगा, और यह कैसे करना है।


9
यहाँ एक awk CSV Parser है जिसे मैंने थोड़ी देर पहले इस्तेमाल किया था .. यह काफी अच्छी तरह से सोचा गया है ... lorance.freeshell.org/csv
Peter.O



2

"CSvtool" को आज़माएं यह पैकेज CSV फ़ाइलों को संभालने के लिए आसान कमांड लाइन टूल है


1
पहले से ही उल्लेख किया गया है, और अधिक विस्तार के साथ ...
जेसनव्रीयन

2

cissy कमांड-लाइन csv प्रोसेसिंग भी करेगी। यह आर (छोटे / हल्के) में आरपीएम और सबसे डिस्ट्रो के लिए उपलब्ध डिब पैकेज के साथ लिखा गया है।

उदाहरण का उपयोग करना:

echo '"this, is the first entry", this is the second, 34.5' | cissy -c 1
"this, is the first entry"

या

echo '"this, is the first entry", this is the second, 34.5' | cissy -c 2
 this is the second

या

echo '"this, is the first entry", this is the second, 34.5' | cissy -c 2-
 this is the second, 34.5

1

CSV प्रारूप में फ़ाइलें पढ़ने / लिखने के लिए एक करी पुस्तकालय भी है : CSV


2
क्या आप कुछ नमूना कोड पोस्ट करने का मन करेंगे, जैसे पर्ल, पायथन और आर उत्तर? (खासकर जब से करी एक सामान्य यूनिक्स स्क्रिप्टिंग भाषा नहीं है।)
गिल्स एसओ- बुराई को रोकें '

@ गिल्स: हाँ, आप सही हैं, मुझे उत्तर को बेहतर बनाने के लिए कुछ नमूना कोड पोस्ट करने चाहिए। मैं थोड़ी देर में ऐसा करने जा रहा हूं।
इम्ज़ - इवान ज़खरीशेव

1

गिथब रेपो स्ट्रक्चर्ड टेक्स्ट टूल्स में प्रासंगिक लिनक्स कमांड लाइन टूल्स की एक उपयोगी सूची है। विशेष रूप से, Delimiter सेपरेटेड वैल्यूज़ सेक्शन में कई CSV सक्षम उपकरण सूचीबद्ध हैं जो सीधे अनुरोध किए गए कार्यों का समर्थन करते हैं।


1

मैं xsv की सिफारिश करूंगा - एक तेज CSV कमांड लाइन टूलकिट जो रस्ट ( गीथूब ) में लिखी गई है

Ripgrep के लेखक द्वारा लिखित ।

में विशेष रुप से हम अपने सीएसवी 142x तेजी से प्रसंस्करण कैसे बना ( रेडिट धागा )।


1

सबसे अच्छे टूल में से एक मिलर ( http://johnkerl.org/miller/doc/index.html ) है। यह awk, sed, cut, join और सॉर्ट करने के लिए नाम-अनुक्रमित डेटा जैसे CSV, TSV, और टेबुलर GSON की तरह है।

उदाहरण में

echo '"this, is the first entry", this is the second, 34.5' | \
mlr --icsv --implicit-csv-header cat

आपको देता है

1=this, is the first entry,2= this is the second,3= 34.5

यदि आप एक टीएसवी चाहते हैं

echo '"this, is the first entry", this is the second, 34.5' | \
mlr --c2t --implicit-csv-header cat

आपको देता है (हेडर निकालना संभव है)

1       2       3
this, is the first entry         this is the second      34.5

यदि आप पहला और तीसरा कॉलम चाहते हैं, तो उनके ऑर्डर को बदल दें

echo '"this, is the first entry", this is the second, 34.5' | \
mlr --csv --implicit-csv-header --headerless-csv-output cut -o -f 3,1

आपको देता है

 34.5,"this, is the first entry"

1

यदि आप टर्मिनल में विजुअल / इंटरेक्टिव टूल चाहते हैं, तो मैं पूरे दिल से विजिडेट की सिफारिश करता हूं।

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

इसमें फ़्रीक्वेंसी टेबल (ऊपर दिखाए गए), पिवट, मेल्टिंग, स्कैप्लेट्स, पायथन का उपयोग करके फ़िल्टरिंग / संगणना और बहुत कुछ है।

आप csv फ़ाइलों को इस तरह से पास कर सकते हैं

vd hello.csv

वहाँ सीएसवी विशिष्ट विकल्प हैं: --csv-dialect, --csv-delimiter, --csv-quotechar, और --csv-skipinitialspaceके लिए परिष्कृत csv फ़ाइलें की हैंडलिंग।


0

एक अजीब समाधान

awk -vq='"' '
func csv2del(n) {
  for(i=n; i<=c; i++)
    {if(i%2 == 1) gsub(/,/, OFS, a[i])
    else a[i] = (q a[i] q)
    out = (out) ? out a[i] : a[i]}
  return out}
{c=split($0, a, q); out=X;
  if(a[1]) $0=csv2del(1)
  else $0=csv2del(2)}1' OFS='|' file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.