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


10

আমার কাছে সিএসভি ফাইল রয়েছে

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. ইত্যাদি।

আমার এই সিএসভি ফাইলটি রূপান্তর করতে হবে

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

উত্তর:


24

অনেক সহজ উপায় ব্যবহার করা হয় tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

এটি যেভাবে কাজ করে তাতে trদুটি আর্গুমেন্ট লাগে - প্রতিস্থাপনের জন্য অক্ষরের সেট এবং তাদের প্রতিস্থাপন। এই ক্ষেত্রে আমাদের কাছে কেবলমাত্র 1 টি অক্ষরের সেট রয়েছে। আমরা input.csvইনপুট trএর স্টিডিন স্ট্রিমটি <শেল অপারেটরের মাধ্যমে পুনর্নির্দেশ করি এবং ফলস্বরূপ আউটপুটটি tr -d '"'ডাবল উদ্ধৃতি মুছতে পাইপ করি ।

তবে awkএটিও করতে পারে।

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

এই কাজ করার উপায়টি কিছুটা পৃথক: awk প্রতিটি ফাইল লাইন এক এক করে লাইন পড়ে, প্রতিটি ইন-লাইন স্ক্রিপ্ট /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}। এখানে আমাদের কোনও প্যাটার্ন নেই, সুতরাং এর অর্থ প্রতিটি লাইনের কোডব্লক চালানো। gsub()ফাংশনটি একটি লাইনের মধ্যে বিশ্বব্যাপী প্রতিস্থাপনের জন্য ব্যবহৃত হয়, সুতরাং আমরা এটি কমা দিয়ে আন্ডারস্কোরগুলি প্রতিস্থাপন করতে এবং নাল স্ট্রিং (কার্যকরভাবে চরিত্রটিকে মোছার) সাথে ডাবল উদ্ধৃতিগুলি ব্যবহার করতে ব্যবহার করি। 1কোড ব্লক, যা অক্ষমতা কেবল লাইন মুদ্রণ করার জন্য অনুপস্থিত সঙ্গে প্যাটার্ন ম্যাচ জায়গা হয়; অন্য কথায় কোডব্লকটি gsub()কাজটি করে এবং 1ফলাফলটি মুদ্রণ করে।

>কোনও নতুন ফাইলে আউটপুট প্রেরণে শেল পুনঃনির্দেশ ( ) ব্যবহার করুন:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

Apologies.I এছাড়াও উল্টানো কমা সরাতে চেয়েছিলেন প্রশ্ন আপডেট too.I
RKR

@RKR উত্তর তদনুসারে আপডেট ইয়ান এর উত্তর এছাড়াও আপডেট করা হয়
Sergiy Kolodyazhnyy

13

বিকল্প হিসাবে, আপনি এই sedআদেশটিও ব্যবহার করতে পারেন :

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
একক উদ্ধৃতিতে, আপনার একটি দ্বিগুণ উদ্ধৃতি এড়াতে হবে না।
গ্লেন জ্যাকম্যান 20'17

সত্যিই @glennjackman! আমি কেবল পালিয়ে যাওয়া ব্যাকস্ল্যাশ
সরিয়েছি

10

কমান্ড-লাইনের পাঠ্য প্রক্রিয়াকরণের "সুইস আর্মি চেইনসো" পার্লও এটি করতে পারে। বাক্যবিন্যাস (কাকতালীয়ভাবে নয়) এর সাথে উদাহরণ trএবং sedউদাহরণগুলির সাথে বেশ অনুরূপ :

perl -pe 'tr/_"/,/d' input.csv > result.csv

বা:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

তবে সত্যই, যদি আপনি এই বেসিক কাজের জন্য একটি নতুন প্রোগ্রামিং ভাষা (যা সত্যই সত্যিকার অর্গল, পার্ল এবং সেড এবং তাদের মতো অন্যান্য সরঞ্জামগুলি) শেখার জন্য সময় নিতে না চান, আপনি ঠিক তেমনভাবে এটি করতেও পারেন অনুসন্ধান এবং প্রতিস্থাপন সমর্থন করে এমন কোনও পাঠ্য সম্পাদক:

  1. আপনার প্রিয় পাঠ্য সম্পাদকটিতে CSV ফাইলটি খুলুন (যেমন gedit, কেট, মাউসপ্যাড, ইত্যাদি; এমনকি উইন্ডোজের সাধারণ পুরানো নোটপ্যাড বা ওয়ার্ডপ্যাড এটি করতে পারে)।

  2. মেনু থেকে "অনুসন্ধান এবং প্রতিস্থাপন" নির্বাচন করুন (আলাদাভাবে "অনুসন্ধান" মেনু না থাকলে সাধারণত "সম্পাদনা" এর অধীনে পাওয়া যায়)।

  3. লিখুন _অনুসন্ধান বাক্সে, এবং ,প্রতিস্থাপন বাক্সে।

  4. "সমস্ত প্রতিস্থাপন করুন" এ ক্লিক করুন।

  5. "অনুসন্ধান বাক্সে এবং প্রতিস্থাপন বাক্সে কিছুই দিয়ে পুনরাবৃত্তি করুন ।

  6. ফাইলটি সংরক্ষণ করুন।

এখন, যদি আপনাকে কেবল একটিটির পরিবর্তে 100 বা 1000 ফাইলের জন্য এটি করতে হয়, তবে একটি নতুন কমান্ড-লাইন সরঞ্জাম শিখলে তা বোঝা শুরু হয়। এবং অবশ্যই, একবার আপনি কীভাবে পার্ল বা সেড বা যে কোনও কিছু ব্যবহার করতে পারবেন তা জানার পরে, আপনি পরে অনুরূপ কাজগুলির সাথে অনেক সময় এবং প্রচেষ্টা সাশ্রয় করবেন। তবে কেবলমাত্র এমন এক-কাজের জন্য যা আপনাকে আবার করার দরকার হয় না, কখনও কখনও পাঠ্য সম্পাদকের মতো একটি প্রাথমিক ইন্টারেক্টিভ সরঞ্জাম হ'ল সহজ সমাধান।


3

আপনি vimপাশাপাশি এটি করতে পারে ।

ফাইলটি খুলুন: vim input.csvতারপরে vimউন্নত অনুসন্ধান সরঞ্জামটি ব্যবহার করুন s:কমান্ড মোডে প্রবেশ করতে কোলন ( ) টাইপ করুন এবং কম্যান্ডের মতো চালান:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

আইএনসি এর উত্তরের মতো অনেকগুলি একই আদেশ, তবে vimব্যবহারের পরিবর্তে ভিতরে sed


2

কেন কেবল ইনপুট এবং আউটপুট পৃথককারী মানগুলির ডিফল্ট মান পরিবর্তন করবেন না

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.