ডাবল কোটের ভিতরে থাকা ব্যতীত উল্লম্ব বারের সাথে কমাটি প্রতিস্থাপন করুন এবং ডাবল উদ্ধৃতিগুলি সরিয়ে ফেলুন


7

file1

12584,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
25841,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
87455,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc

আউটপুট

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

আমার কাছে একটি সিএসভি ফাইল রয়েছে, যা আমাকে শেল স্ক্রিপ্টটি দিয়ে পাইপ (|) দিয়ে ডিলিমেটেড টেক্সট ফাইলে রূপান্তর করতে হবে sed 's/^/"/;s/,/|/g;s/$/"/' $File > $Output

তবে সমস্যাটি হচ্ছে "আমেরিকার রাজধানী, ইনক।" ক্ষেত্র is একটি কমা রয়েছে, এটি পাইপের দ্বারা প্রতিস্থাপিত হয়েছে (|)। সুতরাং আমি কেবল সমস্তটি প্রতিস্থাপন করতে চেয়েছিলাম, পাইপের সাথে মান বাদে মানটিকে ডাবল কোট দেওয়া হয় ""।

এটি করার জন্য কোনও শেল স্ক্রিপ্ট আছে?



এখানে অনেকগুলি সিএসভি পার্সার / জেনারেটর রয়েছে যা আপনি দ্রুত শেল স্ক্রিপ্টের চেয়ে আরও ভাল, আরও সঠিক কাজ করতে পারেন। কেবলমাত্র একটি বিভাজক সহ সিএসভি আমদানি করুন এবং এটি অন্যটির সাথে পুনরায় উত্পন্ন করুন।
কিলিয়ান ফুট

উত্তর:


22

ব্যবহার csvkit:

$ csvformat -D '|' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

csvkitপাইথনে লিখিত সিএসভি হেরফের / অনুসন্ধান সরঞ্জামগুলির একটি সংগ্রহ। এগুলি যথাযথ সিএসভি পার্সিং করে এবং csvformatঅন্য কোনও চরিত্রের সাথে ডিফল্ট কমা ডিলিমিটারটি প্রতিস্থাপন করতে ব্যবহৃত হতে পারে। ইউটিলিটি নিশ্চিত করবে যে সিএসভি বিধি অনুসারে ফলাফলটি যথাযথভাবে উদ্ধৃত হয়েছে।


এই সরঞ্জামটির জন্য উদ্ধৃতি বিধানগুলি বিজোড় বলে মনে হচ্ছে। ডিফল্ট উদ্ধৃতি বিধিগুলির মতো একটি লাইন one , "one""two""t33" , twoরূপান্তরিত হয় one |" ""one""""two""""t33"" "| twoতবে কিছুক্ষণ এটি খেলে আমি (imVHo) সঠিক আউটপুট পেতে সক্ষম হই না one |one"two"t33| two(কারণ পুনরাবৃত্ত উদ্ধৃতিগুলি একটির "প্রতিনিধিত্ব করে ")। এমনকি -bবিকল্প যোগ করা । আপনি আমার সমাধান পছন্দ করতে পারেন।
ইসহাক

@ আইসাক কিন্তু এটি দ্বিতীয় ক্ষেত্রের স্পেসগুলি সরিয়ে দেয়। আপনার উদাহরণের দ্বিতীয় ক্ষেত্রের সমস্ত ডাবল উদ্ধৃতি হ'ল ডেটার অংশ যাহেতু আগে "one"এবং পরে স্থান রয়েছে "t33"। ডাবল ডাবল উদ্ধৃতি ( "") উদ্ধৃত ক্ষেত্রগুলিতে ডাবল উদ্ধৃতি এম্বেড করতে ব্যবহৃত হয় এবং আপনার দ্বিতীয় ক্ষেত্রটি উদ্ধৃত হয় না (ফাঁকির কারণে)। স্থানগুলি সরানো (উদ্ধৃত ক্ষেত্র তৈরি করা) এর "one""two""t33"সাথে পুনরায় ফর্ম্যাট করার পরে ফলন দেয় csvformatযা আমার কাছে সঠিক দেখাচ্ছে।
কুসালানন্দ

হুম। আমি যুক্তিটি বুঝতে পারি যা দাবি করে যে কমা দ্বারা বিযুক্ত সমস্ত অক্ষর (এমনকি স্পেস) ক্ষেত্রের অংশ (কেবলমাত্র উদ্ধৃতিগুলি ক্ষেত্র শুরু এবং শেষ হওয়া ব্যতীত)। চূড়ান্ত নিয়মটি কী হওয়া উচিত তা সম্পর্কে আমি নিশ্চিত নই।
আইজাক

@ আইসাক নিয়মটি হল একটি উদ্ধৃত ক্ষেত্রটি একটি ডাবল উদ্ধৃতি দিয়ে শুরু হয়। এম্বেডযুক্ত ডাবল উদ্ধৃতিগুলি দ্বিগুণ করা উচিত এবং এমবেডড ডাবল উদ্ধৃতি সমেত ক্ষেত্রগুলি সেগুলি উদ্ধৃত হওয়া উচিত। : 5 পয়েন্ট, 6 এবং 7 এর জন্য RFC 4180 "সংজ্ঞা" বিভাগে দেখুন tools.ietf.org/html/rfc4180
Kusalananda

1
(ধারাবাহিক…) (২) শীর্ষস্থানীয় বা পিছনের স্থানগুলির ক্ষেত্রগুলি অবশ্যই দ্বৈত-উদ্ধৃতি অক্ষরের সাথে সীমিত করতে হবে। । আমি উভয় ব্যাখ্যার সাথে বাঁচতে পারি । আসুন আমরা এই বিষয়ে একমত না হতে সম্মত হন। … ... আমি এটিও স্থির করেছি যে একটি awk (এবং সেড বা গ্রেপ) সমাধানটি একটি খারাপ ধারণা, সিএসভি রেকর্ডগুলি বেশ কয়েকটি লাইনের জন্য প্রসারিত হতে পারে এবং জাজ (শেড এবং গ্রেপ) লাইন-ভিত্তিক। একটি যুক্তিসঙ্গত সমাধান বাস্তবায়ন করা কঠিন (খুব কমপক্ষে) করা। +1 :-)
ইসহাক

8

কমপক্ষে ডেবিয়ান-ভিত্তিক সিস্টেমে আপনার ওসিএএমএল-ভিত্তিক ইনস্টল করতে সক্ষম হওয়া উচিত csvtool

$ csvtool -u '|' cat file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

আপনি পার্লের মডিউলটিও ব্যবহার করতে পারেন Text::CSV:

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()} 
  print join "|", $p->fields() if $p->parse($_)
' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

আপনি catএলোমেলোভাবে আপনার csvtoolআদেশে স্থাপন করেছেন ।
ctrl-alt-delor

1
@ ctrl-alt-delor এই প্রসঙ্গে catঅভ্যন্তরীণ csvtoolকমান্ড - ব্যবহার (আমার কাছে অন্তত সংস্করণটি) হ'লcsvtool [-options] command [command-args] input.csv
স্টিল্ড্রাইভার

যদি একটি উদ্ধৃত ক্ষেত্রের ফাঁকা স্থান থাকে: 12584," Capital of America, Inc.",,HORIফলন 12584|" Capital of America, Inc."||HORI(উদ্ধৃতি সরানো হয়নি)।
ইসহাক

@ আইসাক আপনি কি সে সম্পর্কে নিশ্চিত? পার্ল সংস্করণটি (নিঃশব্দে) লাইনগুলি এড়িয়ে যায় যা এটি পার্স করতে ব্যর্থ হয়। (এফওয়াইআই আপনি সম্ভবত এটি সম্ভবত আপনার ভাঙা - পার্স করতে পারেন যেমন অতিরিক্ত বিকল্পগুলি যেমন পার্সার ইনস্ট্যান্ট করে escape_char => "\\", allow_loose_quotes => 1))
স্টিল্ড্রাইভার

হুম। ঠিক আছে, ত্রুটিটি সিএসভিটিওলের জন্যও। 87455|"Capital of"" America"", Inc."||HORIZফলনের মতো একটি লাইন Fatal error: exception Csv.Failure(5, 2, "Non-space char after closing the quoted field")
ইসহাক

2

আপনার সমস্যা সমাধানের জন্য:

awk 'BEGIN{FS=",";OFS="|";} {print $1,$2","$3,$4,$5,$6,$7}' Test | tr -d \"

এ জাতীয় সাধারণ সমস্যার জন্য, জিএনইউতে ক্ষেত্রগুলি বর্ণনা করতে awkএকটি FPAT বিশেষ পরিবর্তনশীল রয়েছে:

awk -vFPAT='[^,]*|("[^"]*")' -vOFS='|' '{$1=$1;print}' Test | tr -d \"
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

awkএবং sedসরঞ্জামগুলির সাথে আপনার অতিরিক্ত প্যাকেজ লাগবে না। সম্পাদনা যেমন Issak উল্লেখ করা হয়েছে, আমি আমার উত্তর আপডেট করুন:

awk -vFPAT='[^,]*|(["].*["])' -vOFS='|' '{print $1,$2,$3,$4,$5,$6}' Test | sed 's/\"//g'

এটি সর্বদা একটি লাইনে দ্বিতীয় কমা সংরক্ষণ করবে, যেখানে যে কমা আসে তা বিবেচনা না করে। দেখানো হয়েছে যে ফাইলটি দেখানো চেয়ে বড়,
কুসালানন্দ

আমার উত্তর এই প্রশ্নের জন্য সঠিক, যাইহোক আমি এটি সম্পাদনা করি।
হোসেইন ভাতানী

এটি যদি একটি লাইনের মতো ব্যর্থ হয় 87455,"Capital of" America", Inc.",,HOR
ইসহাক

2

এসইডি ব্যবহার:

বিকল্প 1:

sed -e 's#,\([^ ]\)#|\1#g;s#"##g;s#|,#||#g' file

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
  • \([^ ]\) সমস্ত কমা প্রতিস্থাপন করুন যা স্থান অনুসরণ করে না।
  • তারপরে "উপসর্গযুক্ত কমাটি সরান এবং প্রতিস্থাপন করুন |

সাধারণত একটি প্রসঙ্গে, একটি কমা স্থান সহ থাকবে। যদি আপনার ক্ষেত্রে না হয় তবে নীচের কোডটি ব্যবহার করে দেখুন।

বিকল্প 2:

sed -e  's#^#\n#;:a;s#\n\([^,"]\|"[^"]*"\)#\1\n#;ta;s#\n,#|\n#;ta;s#\n##;s#"##g' file

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

@ আইজাক আমি আশা করি আপনি আমার দ্বিতীয় বিকল্পটি ব্যবহার করে দেখবেন না। আপনার যদি কোনও উদ্বেগ থাকে তবে আমাকে জানান।
এমএসপি 9011

@ পেট্রো আমি আশা করি আপনি আমার দ্বিতীয় বিকল্পটি ব্যবহার করে দেখবেন না। আপনার যদি কোনও উদ্বেগ থাকে তবে আমাকে জানান।
এমএসপি 9011

নিয়মিত প্রকাশগুলি নেস্টেড উপাদানগুলিকে আলাদাভাবে প্রক্রিয়াকরণের জন্য ডিজাইন করা হয়নি। যদিও আজকাল বেশিরভাগ ইঞ্জিন অ-নিয়মিত এক্সটেনশনের কারণে এর জাতীয় বিবৃতি বিশ্লেষণ করা সম্ভব হয়, তবুও ভুল হওয়া এত সহজ। এটি কাজের জন্য কেবল একটি ভাল সরঞ্জাম নয়।
jpmc26

আমার জন্য সেড-ই এর # ^ # \ n # ;: এ; এস # \ n ([[^, "] \ |" [^ "] *") # \ 1 \ n #; টা; এস # \ n , # | | n #; টা; s # \ n ## 'ফাইলটি কাজ করছে না, আমেরিকার রাজধানী, ইনক। এর মধ্যে "" অপসারণ করছে না
জুহান

@ জুহান আমার আপডেট হওয়া উত্তরটি চেষ্টা করুন।
এমএসপি 9011

1

awk, একবারে একটি চরিত্র

ইনপুট প্রতিটি লাইন, একবারে একটি অক্ষর পরীক্ষা করুন। একটি পাল্টা টগল qমধ্যে 0এবং 1প্রতিটি সময় আপনি একটি ডবল উদ্ধৃতি চিহ্ন সম্মুখীন ", যাতে qসমান 1(অর্থাৎ, প্রতিটি সামনে ডাবল উদ্ধৃতি নম্বরের প্রতিটি জোড়া ভিতরে বন্ধের ডাবল উদ্ধৃতি চিহ্ন)। তারপরে, নির্ভর করে qকমাগুলি ,পাইপের অক্ষরগুলিতে পরিবর্তন করুন |। প্রতিটি লাইন মূল্যায়ন করার পরে, পরিবর্তিত লাইনটি মুদ্রণ করুন।

awk '{
  m=""
  q==0
  for (n=1;n<=length($0);n++) {
    p=substr($0,n,1)
    if (p=="\"") { p="" ; q=(q+1)%2 }
    if (p=="," && q==0) p="|"
    m=m p
    }
  print m
  }' file.csv

ইনপুট:

12584,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
25841,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
87455,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc

আউটপুট:

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc


0

csvমডিউলটি ব্যবহার করে খুব সংক্ষিপ্ত পাইথন স্ক্রিপ্ট সহ :

import csv,sys

with open(sys.argv[1]) as csvfile:
    csvr = csv.reader(csvfile)
    for line in csvr:
        print('|'.join(line))

এটি নিম্নলিখিত হিসাবে কাজ করে:

$ python3 csvfile.py input.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.