ডাবল উদ্ধৃতিতে উপস্থিত কমাগুলি কেবল সরিয়ে দিন


10

একটি পাঠ্য ফাইলে, আমি ,(কমা) এবং "(উদ্ধৃতিগুলি) অপসারণ করতে চাই (কেবলমাত্র ডাবল উদ্ধৃতিতে কমা দ্বারা আলাদা সংখ্যা রয়েছে)।

56,72,"12,34,54",x,y,"foo,a,b,bar"

প্রত্যাশিত আউটপুট

56,72,123454,x,y,"foo,a,b,bar"

দ্রষ্টব্য: আমি উপরের লাইনটি কেবল উদাহরণ হিসাবে দেখাই। আমার পাঠ্য ফাইলটিতে উপরের মতো অনেকগুলি লাইন রয়েছে এবং ডাবল উদ্ধৃতিতে উপস্থিত কমা দ্বারা পৃথক করা সংখ্যাগুলি পৃথক হওয়া উচিত। এটাই,

56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"

প্রত্যাশিত আউটপুট:

56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"

nকমা দ্বারা আলাদা ডাবল উদ্ধৃতিতে উপস্থিত একটি সংখ্যা। এবং ডাবল উক্তিগুলি যেমন রয়েছে তেমন অক্ষর রয়েছে leave

আমি sedটেক্সট প্রসেসিং সরঞ্জাম পছন্দ করি। আপনি যদি এর sedজন্য কোনও সমাধান পোস্ট করেন তবে আমি খুশি ।


থেকে 56,72,"12,34,54",x,y,"foo,a,b,bar"থেকে 56,72,123454,x,y,"a,b", fooএবং barহয় উধাও হয়ে যায়। এটা কি আপনার কাঙ্ক্ষিত আউটপুট?
cuonglm

আপনার ব্যবহৃত উদাহরণটি কিছুটা বিভ্রান্তিকর কারণ কিছু উপাদান (যেমন fooএবং bar) কমাগুলি সহ সরানো হয়েছে। তদ্ব্যতীত, কিছু উদ্ধৃতি অদৃশ্য হয়ে যায় যেখানে অন্যরা রয়ে যায়। কমাগুলির মধ্যে aএবং bপাশাপাশি থাকবে তা উল্লেখ করার দরকার নেই । এগুলিতে কি কোন প্যাটার্ন আছে?
HalosGhost

সম্পাদিত দুঃখিত বন্ধুরা।
অবিনাশ রাজ

আপনার সম্পাদনাগুলি সত্যই আপনার উদাহরণটি স্পষ্ট করে না। দয়া করে দেখুন আমার শেষ মন্তব্য
HalosGhost

ডাবল কোটের ভিতরে থাকা সমস্ত কমা এবং উদ্ধৃতিগুলিতে কেবল সংখ্যাগুলি থাকে তবে মুদ্রণ করুন।
অবিনাশ রাজ

উত্তর:


7

এটি ( এখান থেকে রূপান্তরিত ) আপনার যা করা দরকার তা করা উচিত যদিও @ রিচি এর পার্লটি খুব সহজ:

$ sed -r ':a;s/(("[0-9,]*",?)*"[0-9,]*),/\1/;ta; s/""/","/g; 
          s/"([0-9]*)",?/\1,/g ' file
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454,
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"

ব্যাখ্যা

  • :a: বলা একটি লেবেল সংজ্ঞায়িত a
  • s/(("[0-9,]*",?)*"[0-9,]*),/\1/ : এটিকে ভেঙে ফেলা দরকার
    • প্রথম সব, এই কনস্ট্রাক্ট ব্যবহার করছে: (foo(bar)), \1হতে হবে foobarএবং \2হতে হবে bar
    • "[0-9,]*",?: মেলে 0 বা তার থেকে বেশি 0-9বা ,, 0 বা 1 দ্বারা অনুসরণ ,
    • ("[0-9,]*",?)* : উপরোক্ত 0 বা তারও বেশি ম্যাচ করুন।
    • "[0-9,]*: 0 বা তার বেশি 0-9বা এর সাথে মিলে যায় ,যা ঠিক পরে আসে"
  • ta;: লেবেলে ফিরে যান aএবং বিকল্পটি সফল হলে আবার চালান run
  • s/""/","/g;: পোস্ট প্রসেসিং. ""সঙ্গে প্রতিস্থাপন ","
  • s/"([0-9]*)",?/\1,/g : সংখ্যার চারপাশে সমস্ত উদ্ধৃতি সরান।

এটি অন্য উদাহরণের সাহায্যে বোঝা সহজ হতে পারে:

$ echo '"1,2,3,4"' | sed -nr ':a;s/(("[0-9,]*",?)*"[0-9,]*),/\1/;p;ta;'
"1,2,34"
"1,234"
"1234"
"1234"

সুতরাং, আপনি যখন কোটের ঠিক পরে এবং একটি কমা এবং অন্য একটি নম্বর অনুসরণ করে এমন একটি সংখ্যা খুঁজে পেতে পারেন তবে দুটি সংখ্যা একসাথে যোগ দিন এবং যতক্ষণ সম্ভব না হওয়া অবধি প্রক্রিয়াটি পুনরাবৃত্তি করুন।

এই মুহুর্তে আমি বিশ্বাস করি info sedযে উপরেরটি ব্যবহৃত লেবেলের মতো উন্নত ফাংশনগুলি বর্ণনাকারী বিভাগে উপস্থিত একটি উদ্ধৃতি উল্লেখ করা কার্যকর হবে (@ ব্রাইয়াম কিনা তা সন্ধানের জন্য ধন্যবাদ):

বেশিরভাগ ক্ষেত্রে, এই কমান্ডগুলির ব্যবহার ইঙ্গিত দেয় যে আপনি সম্ভবত "`ডাব" বা পার্লের মতো কোনও প্রোগ্রামিংয়ের চেয়ে ভাল off


10

পার্ল যদি ঠিক থাকে তবে এটি করার একটি সংক্ষিপ্ত (এবং সম্ভবত দ্রুত, এটি খুব সহজ নয় তবে :)) way

perl -pe 's:"(\d[\d,]+)":$1=~y/,//dr:eg' file

eপতাকা s:::অপারেটর (যা শুধু লেখার আরেকটি উপায় s///) প্রতিস্থাপন একটি অভিব্যক্তি যা প্রত্যেক সময় মূল্যায়ন হিসাবে চিকিত্সা করা হয়। এই অভিব্যক্তিটি $1রেজেক্স থেকে ক্যাপচার নেয় (যা ইতিমধ্যে উদ্ধৃতিগুলি নিখোঁজ রয়েছে) এবং অনুবাদ করে ( y///যা এটিও লেখা যেতে পারে ) সমস্ত কমা tr///মুছে ফেলার মাধ্যমে /drপতাকা yপরিবর্তে অনুবাদগুলির গণনা, যাতে মান অনূদিত স্ট্রিং হতে পেতে প্রয়োজন।

যারা পার্ল দ্বারা কোনওরকমে নিখোঁজ বোধ করেন তাদের জন্য এখানে অজগর সমতুল্য। পাইথন সত্যিকার অর্থে শেল ওয়ান-লাইনার সরঞ্জাম নয়, তবে কখনও কখনও এটি কো-অপারেটিংয়ে সিজল করা যায়। নিম্নলিখিতগুলি একটি লাইন হিসাবে লেখা যেতে পারে ( forলুপগুলির বিপরীতে , যা হতে পারে না) তবে অনুভূমিক স্ক্রোলিং এটিকে (আরও বেশি) অপঠনযোগ্য করে তোলে:

python -c '
import re;
import sys;
r=re.compile("\"(\d+(,\d+)*)\"");
all(not sys.stdout.write(r.sub(lambda m:m.group(1).replace(",",""),l))
    for l in sys.stdin)
' < file

@ আরকি: ভাল! এবং আমাদের আরও একটি চরিত্র সংরক্ষণের y///পরিবর্তে ব্যবহার করুন tr///
cuonglm

6

CSV ডেটার জন্য, আমি একটি আসল CSV পার্সার সহ একটি ভাষা ব্যবহার করব। উদাহরণস্বরূপ রুবি সহ:

ruby -rcsv -pe '
  row = CSV::parse_line($_).map {|e| e.delete!(",") if e =~ /^[\d,]+$/; e} 
  $_  = CSV::generate_line(row)
' <<END
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
END
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"

0

ব্লককোট

হাই এখানে ডাবল কোট দিয়ে কমাগুলি প্রতিস্থাপন করার জন্য পাইথন কোডটি দেওয়া হয়েছে, পাইপ (|) অক্ষর দিয়ে কমাগুলি প্রতিস্থাপন করা হবে

এই পাইথন কোডটি ডাবল কোটে অন্তর্ভুক্ত কমাগুলি প্রতিস্থাপন করবে

যেমন: x, y, z, 1,2, "r, e, t, y", h, 8,5,6 5

পাইপ x, y, z, 1,2, "r | e | t | y", h, 8,5,6 দিয়ে প্রতিস্থাপন করা হলে

যদি নাল x, y, z, 1,2, "রিটি", এইচ, 8,5,6 এর সাথে প্রতিস্থাপন করে

writingFile = open('FileToWrite', 'w')
with open('FileToRead') as f:

    while True:

        c = f.read(1)
        if not c:
            print ("End of file")
            break
        print ("Read a character:", c)


        if c=='"':
            writingFile.write(c) 
            c = f.read(1)
            while c != '"':
                if c== ',':
                    c= '|'
                writingFile.write(c)
                c = f.read(1)


        writingFile.write(c)


writingFile.close()

সামান্য ব্যাখ্যা প্রয়োজন।
মোংরেল

এই অজগর কোডটি ডাবল উদ্ধৃতিতে জিনিসগুলি প্রতিস্থাপনের জন্য ব্যবহার করা হয়েছে
বিজয় কুমার আকারাপু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.