CSV को TSV में परिवर्तित करना


27

मेरे पास कई बड़ी सीएसवी फाइलें हैं और वे टीएसवी (टैब अलग प्रारूप) में उन्हें पसंद करेंगे। जटिलता यह है कि CSV फ़ाइल के क्षेत्र में अल्पविराम हैं, उदाहरण के लिए:

 A,,C,"D,E,F","G",I,"K,L,M",Z

अपेक्षित उत्पादन:

 A      C   D,E,F   G   I   K,L,M   Z

(जहां बीच में व्हॉट्सऐप 'हार्ड' टैब हैं)

मेरे पास इस सर्वर पर पर्ल, पायथन और कोरुटिल्स हैं।


मैं नोड.जेएस के साथ या पर्ल के साथ ऐसा करूंगा।
पेटेर का कहना है कि मोनिका

1
गैर-उद्धृत कॉमा को टैब से बदलें ...
क्रिकेट_007

हां, अगर मेरे पास इस प्रश्न के लिए 5 मिनट से अधिक समय था। लेकिन मैं अपने मतों से उत्तर देने वालों का सहर्ष समर्थन करूंगा। मैंने जो कहने की कोशिश की, वह यह है कि आम सीड / ऑक थिंग्स शायद इसके लिए अयोग्य हैं (कम से कम उनके आमतौर पर इस्तेमाल किए जाने वाले उपयोग में)।
पीटर ने मोनिका

6
मुझे यकीन नहीं है कि यदि आपका उदाहरण वास्तविक डेटा का प्रतिनिधि है, लेकिन यदि वे वास्तविक पाठ स्ट्रिंग होने जा रहे हैं, तो यह मत भूलो कि आपको उस मामले को संभालने की आवश्यकता हो सकती है जहां स्ट्रिंग में एक टैब शामिल है ...
AC

3
अन्य मुश्किल हिस्सा यह है कि CSV एक बहुत ही कम परिभाषित प्रारूप है, कोई वास्तविक मानक नहीं है (एक RFC है लेकिन यह तथ्य के वर्षों बाद लिखा गया था)। मैंने कोड लिखा है जो एक भाषा-आपूर्ति वाले CSV पार्सर का उपयोग करता है और फिर उसे कस्टम पार्सर के साथ फिर से लिखना पड़ा क्योंकि मुझे लगा कि इनपुट डेटा सीएसवी प्रारूप के टूटे हुए संस्करण में था।
प्लग

जवाबों:


37

अजगर

नामित फ़ाइल में जोड़ें csv2tab.sh, और इसे निष्पादन योग्य बनाएं

#!/usr/bin/env python
import csv, sys
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))

टेस्ट चलता है

$ echo 'A,,C,"D,E,F","G",I,"K,L,M",Z' | ./csv2tab.sh                         
A       C   D,E,F   G   I   K,L,M   Z

$ ./csv2tab.sh < data.csv > data.tsv && head data.tsv                                                   
1A      C   D,E,F   G   I   K,L,M   Z
2A      C   D,E,F   G   I   K,L,M   Z
3A      C   D,E,F   G   I   K,L,M   Z

5
एक संभावित बग: यह उत्तर आंतरिक टैब से बच नहीं सकता है।
मॉर्गन

4
@ मॉर्गन csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))? लूप को भी खत्म कर देता है।
मूरू

1
@chx कोशिश करें python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'। मुझे संदेह -mहै कि इस तरह से काम करता है।
मूरू

18

मस्ती के लिए, sed

sed -E 's/("([^"]*)")?,/\2\t/g' file

यदि आपका sedसमर्थन नहीं करता है -E, तो प्रयास करें -r। यदि आपका शाब्दिक टैब के लिए sedसमर्थन नहीं करता है \t, तो शाब्दिक टैब (कई गोले, ctrl- v tab) में या बैश में डालने का प्रयास करें, $'...'सी-स्टाइल स्ट्रिंग का उपयोग करें (जिस स्थिति में बैकस्लैश को \2दोगुना करने की आवश्यकता है)। यदि आप उद्धरण रखना चाहते हैं, तो \1इसके बजाय का उपयोग करें \2(जिस स्थिति में कोष्ठक की आंतरिक जोड़ी बेकार है, और हटाया जा सकता है)।

इससे डबल कोट्स के अंदर बच गए दोहरे उद्धरणों को संभालने का कोई प्रयास नहीं होता है; कुछ CSV बोलियाँ उद्धृत दोहरे उद्धरण (sic) को दोगुना करके इसका समर्थन करती हैं।


1
मुझे लगता है कि मैंने इसे प्राप्त करने के लिए लगभग 100 अलग-अलग सेड स्क्रिप्ट की कोशिश की, लेकिन मेरे सभी प्रयास विफल रहे। यह कमाल का है।
जॉर्ज वासिलिउ

16

उदाहरण के लिए csvkitउपयोगिता (पायथन) का उपयोग करना :

$ csvformat -T in.csv > out.txt

सही CSV और TSV को उद्धृत करने और भागने के साथ स्ट्रीमिंग करता है

यह उपयुक्त और अन्य पैकेज प्रबंधकों में है


13

एक विकल्प पर्ल का पाठ :: सीएसवी मॉड्यूल जैसे हो सकता है

perl -MText::CSV -lne 'BEGIN { $csv = Text::CSV->new() }
  print join "\t", $csv->fields() if $csv->parse($_)
' somefile

प्रदर्शित करना

echo 'A,,C,"D,E,F","G",I,"K,L,M",Z' |
  perl -MText::CSV -lne 'BEGIN { $csv = Text::CSV->new() }
  print join "\t", $csv->fields() if $csv->parse($_)
'
A       C   D,E,F   G   I   K,L,M   Z

1
यदि फ़ील्ड में टैब नहीं है, तो यह सही नहीं होगा
नील मैकगिन

6

पर्ल

perl -lne '
   my $re = qr/,(?=(?:[^"]*"[^"]*")*(?![^"]*"))/;
   print join "\t", map { s/(?<!\\)"//gr =~ s/\\"/"/gr } split $re;
'

awk

awk -v Q=\" -v FPAT="([^,]*)|(\"[^\"]+\")" -v OFS="\t" '{
   for (i=1; i<=NF; ++i)
      if ( substr($i, 1, 1) == Q )
         $i = substr($i, 2, length($i) - 2)
   print $1, $2, $3, $4, $5, $6, $7, $8
}'

परिणाम:

A               C       D,E,F   G       I       K,L,M   Z

+1 पर्ल संस्करण एक आकर्षण की तरह काम करता है
एटोरस

4

थर्मोन्यूक्लियर फ्लाईस्वाटर समाधान का उपयोग लिबेरोफाइस के लिए किया जाना चाहिए। जबकि https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode / पता चलता है कि यह संभव नहीं है, लेकिन यह गलत है (या सिर्फ पुराना है?) और निम्नलिखित आदेश मेरे 5.3 पर काम करता है।

loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv

envतर्क को छोड़ दिया हो सकता है लेकिन इस तरह से दस्तावेजों अपने हाल के दस्तावेज़ में दिखाई नहीं देगा।


2
मुझे लगता है कि सच थर्मोन्यूक्लियर फ्लाईस्वाटर एक जावा उपयोगिता लिख ​​रहा होगा, जो कि लिब्रे ऑफिस के यूएनओ एपीआई :) के माध्यम से किया जाएगा।
पोंट

3

यदि आपके पास है, या स्थापित कर सकते हैं, तो csvtoolउपयोगिता:

csvtool -t COMMA -u TAB cat in.csv > out.ctv

ध्यान दें कि किसी कारण के लिए csvtoolएक आदमी पृष्ठ नहीं है, लेकिन csvtool --helpदस्तावेज की एक सौ लाइनें मुद्रित करेगा।


3

उपयोग करना mlrलगभग पर्याप्त है, लेकिन हेडर को अक्षम करने के लिए लंबे विकल्प की आवश्यकता होती है:

mlr --c2t --implicit-csv-header --headerless-csv-output cat file.csv 

आउटपुट:

A       C   D,E,F   G   I   K,L,M   Z

3

मैंने TSV कनवर्टर के लिए एक ओपन-सोर्स CSV लिखा है जो वर्णित परिवर्तनों को संभालता है। यह काफी तेज़ है, एक नज़र के लायक हो सकता है अगर बड़ी CSV फ़ाइलों को परिवर्तित करने की आवश्यकता हो। टूल ईबे के TSV उपयोगिताओं टूलकिट का हिस्सा है (csv2tsv प्रलेखन यहाँ )। वर्णित इनपुट के लिए डिफ़ॉल्ट विकल्प पर्याप्त हैं:

$ csv2tsv file.csv > file.tsv

2

शक्ति

सिर्फ मनोरंजन के लिए, रेगेक्स प्रतिस्थापन वीम में किया जा सकता है । यहाँ एक संभावित चार लाइन समाधान है, इससे अनुकूलित: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex

  1. उद्धरणों के बीच कॉमेस को पहले अंडरस्कोर (या अन्य अनुपस्थित चरित्र) में बदल दिया जाता है,
  2. अन्य सभी अल्पविरामों को टैब से बदल दिया जाता है,
  3. उद्धरण के अंदर अंडरस्कोर कॉमा को बहाल किए जाते हैं,
  4. उद्धरण चिह्न हटा दिए जाते हैं।

    :%s/".\{-}"/\=substitute(submatch(0), ',', '_' , 'g')/g
    :%s/,/\t/g
    :%s/_/,/g
    :%s/"//g

समाधान को कुछ हद तक लिपिबद्ध करने के लिए, ऊपर की चार लाइनें (sans अग्रणी कोलन) को फ़ाइल में सहेजा जा सकता है, उदा to_tsv.vim। साथ संपादन के लिए प्रत्येक CSV खोलें विम और पर स्क्रिप्ट विम कमांड लाइन (से अनुकूलित /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ): sourceto_tsv.vim

    :source /path/to/vim/filename/to_tsv.vim

1

jqउपयोगिता का उपयोग करके CSV को TSV में परिवर्तित करने का उदाहरण यहां दिया गया है :

$ jq -rn '@tsv "\(["A","","C","D,E,F","G","I","K,L,M","Z"])"'
A       C   D,E,F   G   I   K,L,M   Z

या:

$ echo '["A","","C","D,E,F","G","I","K,L,M","Z"]' | jq -r @tsv
A       C   D,E,F   G   I   K,L,M   Z

हालाँकि CSV प्रारूप को अच्छी तरह से स्वरूपित करने की आवश्यकता है, इसलिए प्रत्येक स्ट्रिंग को उद्धृत करने की आवश्यकता है।

स्रोत: सरल टीएसवी आउटपुट प्रारूप



0

निम्नलिखित केवल @tripleee से उत्तर के लिए एक सुधार है ताकि यह अंतिम फ़ील्ड से किसी भी उद्धरण को उसी तरह से स्ट्रिप्स करें जैसा कि अन्य सभी फ़ील्ड्स के लिए है।

यह दिखाने के लिए कि क्या सही किया जा रहा है, नीचे एक ट्रिपल का जवाब है, साथ ही ओपी के उदाहरण डेटा के साथ अंतिम ' जेड ' क्षेत्र के आसपास जोड़े गए उद्धरणों के साथ थोड़ा सा संशोधन ।

echo 'A,,C,"D,E,F","G",I,"K,L,M","Z"' |  sed -r -e 's/("([^"]*)")?,/\2\t/g'
A       C   D,E,F   G   I   K,L,M   "Z"

आप देख सकते हैं कि इसके चारों ओर उद्धरण के साथ ' Z ' बचा हुआ है। यह अलग है कि आंतरिक क्षेत्रों को कैसे संभाला जाता है। उदाहरण के लिए, ' G ' पर उद्धरण नहीं है।

निम्नलिखित कमांड अंतिम कॉलम को साफ करने के लिए दूसरे प्रतिस्थापन का उपयोग करती है:

echo 'A,,C,"D,E,F","G",I,"K,L,M","Z"' |  sed -r -e 's/("([^"]*)")?,/\2\t/g' \
                                                -e 's/\t"([^"]*)"$/\t\1/'
A       C   D,E,F   G   I   K,L,M   Z

1
जब इनपुट डेटा 'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'इस उत्तर के लिए इनपुट होता है, तो सही के बजाय "Z,A"गलत तरीके से बदल दिया जाता Z Aहै Z,A
अगस्त
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.