সিএসভিকে টিএসভিতে রূপান্তর করা হচ্ছে


27

আমার কাছে বেশ কয়েকটি বড় সিএসভি ফাইল রয়েছে এবং সেগুলি টিএসভিতে (ট্যাব দ্বারা পৃথক ফর্ম্যাট) চাই। জটিলতাটি হ'ল সিএসভি ফাইলের ক্ষেত্রগুলিতে কমা রয়েছে, যেমন:

 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
আমি নিশ্চিত নই যে আপনার উদাহরণটি প্রকৃত উপাত্তের প্রতিনিধি কিনা, তবে সেগুলি যদি প্রকৃত পাঠ্য স্ট্রিং হতে চলেছে তবে ভুলে যাবেন না যে স্ট্রিংটিতে একটি ট্যাব রয়েছে এমন ক্ষেত্রে আপনি হ্যান্ডেল করার প্রয়োজন হতে পারে ...
এসি

3
অন্যটি জটিল অংশটি হ'ল সিএসভি একটি খুব আলগাভাবে সংজ্ঞায়িত ফর্ম্যাট, কোনও আসল মান নেই (একটি আরএফসি আছে তবে এটি সত্যের বহু বছর পরে লেখা হয়েছিল)। আমি এমন একটি কোড লিখেছি যা কোনও ভাষা সরবরাহিত সিএসভি পার্সার ব্যবহার করে এবং তারপরে এটি একটি কাস্টম পার্সার দিয়ে আবার লিখতে হয়েছিল কারণ আমি খুঁজে পেলাম যে ইনপুট ডেটা সিএসভি ফর্ম্যাটের একটি ভাঙা রূপে রয়েছে।
প্লাগওয়াশ

উত্তর:


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(সেক্ষেত্রে বন্ধনীগুলির অভ্যন্তরীণ জুটি অকেজো এবং এটি সরানো যেতে পারে)।

এটি ডাবল উদ্ধৃতিগুলির মধ্যে পালিয়ে যাওয়া ডাবল উদ্ধৃতিগুলি হ্যান্ডেল করার কোনও প্রচেষ্টা করে না; কিছু সিএসভি উপভাষাগুলি উদ্ধৃত ডাবল উদ্ধৃতি (sic) দ্বিগুণ করে এটিকে সমর্থন করে।


1
আমি মনে করি যে এটি অর্জনের জন্য আমি প্রায় 100 টি আলাদা সেড স্ক্রিপ্ট চেষ্টা করেছি তবে আমার সমস্ত প্রচেষ্টা ব্যর্থ হয়েছে। এটা সত্যিই দারুন.
জর্জ ভ্যাসিলিউ

16

ব্যবহার csvkitইউটিলিটি (পাইথন) উদাহরণস্বরূপ:

$ csvformat -T in.csv > out.txt

স্ট্রিমিং করে, সঠিক সিএসভি এবং টিএসভির উদ্ধৃতি এবং পলায়নের সাথে

এটি উপযুক্ত এবং অন্যান্য প্যাকেজ পরিচালকদের মধ্যে রয়েছে


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

আমি টিএসভি রূপান্তরকারী একটি ওপেন-সোর্স সিএসভি রচনা করেছি যা বর্ণিত রূপান্তরগুলি পরিচালনা করে। এটি বেশ দ্রুত, বৃহত্তর সিএসভি ফাইলগুলিতে রূপান্তর করতে যদি চলমান চলমান দরকার হয় তবে তা দেখার মতো হতে পারে। সরঞ্জাম ইবেয়ের টিএসভি ইউটিলিটিস টুলকিট (সিএসভি 2tsv ডকুমেন্টেশন এখানে ) এর অংশ। বর্ণিত ইনপুটটির জন্য ডিফল্ট বিকল্পগুলি যথেষ্ট:

$ csv2tsv file.csv > file.tsv

2

তেজ

শুধু মজার জন্য, Regex বদল সম্পন্ন করা যায় তেজ । এখানে একটি সম্ভাব্য চারটি লাইন সমাধান রয়েছে, যা থেকে গৃহীত: /programming/

  1. উদ্ধৃতিগুলির মধ্যে কমাগুলি প্রথমে আন্ডারস্কোর (বা অন্যান্য অনুপস্থিত চরিত্র) এ পরিবর্তিত হয়,
  2. অন্যান্য সমস্ত কমাগুলি ট্যাবগুলিতে প্রতিস্থাপন করা হয়েছে,
  3. কোটরের অভ্যন্তরীণ বোঝাপড়াগুলি কমাতে পুনরুদ্ধার করা হয়েছে,
  4. উদ্ধৃতি চিহ্নগুলি সরানো হয়েছে।

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

সমাধানটি কিছুটা স্ক্রিপ্ট করার জন্য, উপরের চারটি লাইন (সান লিডিং কোলন) কোনও ফাইলে সংরক্ষণ করা যায়, যেমন 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ইউটিলিটি ব্যবহার করে সিএসভিকে টিএসভিতে রূপান্তর করার উদাহরণ এখানে দেওয়া হয়েছে :

$ 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

তবে সিএসভি ফর্ম্যাটটি ভাল ফর্ম্যাট করা দরকার, তাই প্রতিটি স্ট্রিংয়ের উদ্ধৃতি দেওয়া দরকার।

উত্স: সাধারণ টিএসভি আউটপুট ফর্ম্যাট


1

সহ perl, ধরে নিলাম সিএসভি ক্ষেত্রগুলিতে কোনও এমবেড করা "বা নতুনলাইন বা ট্যাব নেই:

perl -pe 's{"(.*?)"|,}{$1//"\t"}ge'

0

নিম্নলিখিতটি @ ট্রাইপলির উত্তরের কেবল একটি সংশোধন যাতে এটি অন্যান্য ক্ষেত্রের মতো চূড়ান্ত ক্ষেত্র থেকে যে কোনও উদ্ধৃতি সরিয়ে দেয়।

কী সংশোধন হচ্ছে তা দেখানোর জন্য, নীচে একটি ট্রিপলির জবাব, চূড়ান্ত ' জেড ' ক্ষেত্রের আশেপাশের যুক্ত উদ্ধৃতিগুলির সাথে ওপি'র উদাহরণ ডেটাতে একটি সামান্য পরিবর্তন ।

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"

আপনি দেখতে পাচ্ছেন যে ' জেড ' এর চারপাশে উদ্ধৃতি রয়েছে। অভ্যন্তরীণ ক্ষেত্রগুলি কীভাবে পরিচালনা করা হয় তার থেকে এটি আলাদা। উদাহরণস্বরূপ, ' জি ' এর উপর কোট নেই।

নিম্নলিখিত কমান্ডটি চূড়ান্ত কলামটি পরিষ্কার করতে দ্বিতীয় বিকল্প ব্যবহার করে:

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 AZ,A
এগ্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.