সিএসভি ফাইলের একটি কলাম কীভাবে বের করবেন


111

আমার কাছে যদি সিএসভি ফাইল থাকে তবে কেবল কোনও একক কলামের বিষয়বস্তু মুদ্রণের জন্য কি দ্রুত বাশ উপায় আছে? এটি ধরে নেওয়া নিরাপদ যে প্রতিটি সারিতে একই সংখ্যক কলাম রয়েছে তবে প্রতিটি কলামের সামগ্রীর দৈর্ঘ্য আলাদা হবে।

উত্তর:


135

আপনি এর জন্য বিশ্রী ব্যবহার করতে পারেন। আপনি চান নবম কলামে '$ 2' পরিবর্তন করুন।

awk -F "\"*,\"*" '{print $2}' textfile.csv

13
echo '1,"2,3,4,5",6' | awk -F "\"*,\"*" '{print $2}'2পরিবর্তে মুদ্রণ করবে 2,3,4,5
ইগোর মিকুশকিন

আপনি উইন্ডোজে গনুহ সরঞ্জাম ব্যবহার করে একটি ভাগ্যবান লোক হন, তাহলে আপনি একই comand যেমন @IgorMikushkin নিম্নরূপ নির্বাহ করতে পারেন:gawk -F"|" "{print $13}" files*.csv
Elidio Marquina

10
আমি মনে করি এটি ব্যর্থ হয় যখন কোনও ...,"string,string",...
কমাযুক্ত

আমি মনে করি 1 ম এবং শেষ কলমের জন্য, এতে কিছু ত্রুটি থাকবে। প্রথম কলামটি শুরু হবে "এবং শেষ হবে"
বিগটাইল ওল্ফ

কিছু প্রোগ্রাম সিএসভি ফাইলগুলিকে বিভিন্ন সীমানার দিয়ে ফেরত দেয়, তাই নিয়মিত প্রকাশটি সেই অনুযায়ী পরিবর্তন করার প্রয়োজন হতে পারে। সেমিকোলন ডিলিমিটারের উদাহরণ: awk -F "\"*;\"*" '{print $2}' textfile.csv
শে

88

হ্যাঁ. cat mycsv.csv | cut -d ',' -f33 য় কলাম প্রিন্ট করা হবে।


8
যদি না কলাম দুটিতে কমা থাকে তবে আপনি কলামের দ্বিতীয়ার্ধের দ্বিতীয় ভাগ পেতে পারেন। <col1> পয়েন্টের ক্ষেত্রে, "3,000", <কল 2> Case আমার উত্তরটি যদিও এই সমস্যার ক্ষেত্রে সম্মানের সাথে খুব বেশি ভাল নয়। সুতরাং বম আউট করা হবে না।
সিনথেসাইজারপ্যাটেল

@ সাইন্সেসাইজারপেটেল আমি আরও ভালভাবে ব্যবহার করতে রাজিawk
ম্যাটসিজল

1
আমরা নিশ্চিত নই যে তার সিএসভি ফাইলে বিভিন্ন মানকে আলাদা করতে ডাবল কোট রয়েছে। আরও ভাল হবে যে সে একটি ইনপুট ফাইল সরবরাহ করবে যাতে আমরা সর্বাধিক উপযুক্ত সমাধানটি মূল্যায়ন করতে পারি।
ইদ্রিস নিউম্যান

50

এটি করার সহজতম উপায়টি হ'ল csvtool ব্যবহার করা । সিএসভিটিউল ব্যবহার করার জন্য আমার কাছে অন্যান্য ব্যবহারের কেস ছিল এবং এটি কলামের ডেটাতে উপস্থিত হয়ে যদি তা উদ্ধৃত বা ডিলিমিটরগুলিকে যথাযথভাবে পরিচালনা করতে পারে।

csvtool format '%(2)\n' input.csv

2 টি কলামের নম্বর দিয়ে প্রতিস্থাপন করা কার্যকরভাবে আপনার সন্ধান করা কলামের ডেটা বের করবে।


14
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এই সরঞ্জামটি CSV ফাইলগুলির সাথে ক্ষেত্র বিভাজক হিসাবে কমা ব্যবহারের চেয়েও কীভাবে মোকাবেলা করতে জানে। ২ য় কলামটি বের করতে, "সিএসভিটিওল কল 2 ইনপুট সিএসভি"
ভ্লাদিসালভস দোভালিক্লস

3
কেবলমাত্র শীর্ষস্থানীয় ... আপনি যদি স্ট্যান্ডার্ড ইনপুট (csv অন্য কমান্ড থেকে আসে উদাহরণস্বরূপ) সাথে csvtool ব্যবহার করতে চান তবে এটি এমন একটি cat input.csv | csvtool formath '%(2)\n' -নোট যা আমি জানি এখানে বিড়াল অকেজো কিন্তু এটি কোনও কমান্ডের জন্য সাবমাস যা একটি সিএসভি রফতানি করবে sub
জেনারেল রেডনেক

এটি মাল্টলাইন ক্ষেত্র রয়েছে, format '%(2)\n'একটি ক্ষেত্র কোথায় শেষ হবে তা কমান্ডটি বলতে পারেনি। (csvtool 1.4.2)
জার্নো

1
নতুন সংস্করণগুলির স্ট্যান্ডিন থেকে পড়ার জন্য ইনপুট ফাইলের নাম হিসাবে csvtoolব্যবহার করা দরকার বলে মনে হয় -
কনার ক্লার্ক

@ জেনারাল রেডনেক কেন বিড়াল ব্যবহার করবেন? এবং এটি ফর্ম্যাট নয়csvtool format '%(1),%(10)\n' - < in.csv > out.csv
সিজনে

14

একটি ট্যাব বিচ্ছিন্ন ফাইল থেকে নিষ্কাশন করতে খুঁজছেন এখানে অবতরণ। ভেবেছিলাম আমি যুক্ত করব।

cat textfile.tsv | cut -f2 -s

যেখানে -f22, শূন্য-বিহীন সূচকযুক্ত কলাম বা দ্বিতীয় কলামটি বের করে।


সহজ, খুব পয়েন্ট এবং অন্যান্য উদাহরণগুলির তুলনায় আরও সহজে অভিযোজিত। ধন্যবাদ!
নিক জেনিংস

6
নিতপিকিং, তবে catঅপ্রয়োজনীয়:< textfile.tsv cut -f2 -s
অ্যান ভ্যান

8

এই প্রশ্নের জন্য অনেক উত্তর দুর্দান্ত এবং কিছু এমনকি কোণার ক্ষেত্রে সন্ধান করেছে। আমি একটি সাধারণ উত্তর যুক্ত করতে চাই যা প্রতিদিনের ব্যবহারের হতে পারে ... যেখানে আপনি বেশিরভাগ ক্ষেত্রে এই কোণার ক্ষেত্রে (যেমন কমাতে বা কমাতে কমাতে পলায়ন ইত্যাদির মধ্যে পড়ে) ইত্যাদি পেতে পারেন)

এফএস (ফিল্ড বিভাজক) হল এমন পরিবর্তনশীল যার মানটি স্থানকে স্থানান্তরিত করে। তাই কোনও লাইনের জন্য স্পেসে ডিফল্টভাবে বিভক্ত হয়ে যায়।

তাই শুরু করুন (ইনপুট নেওয়ার আগে এক্সিকিউট করুন) আমরা এই ফিল্ডটিকে আমাদের যে কোনও কিছুতে সেট করতে পারি ...

awk 'BEGIN {FS = ","}; {print $3}'

উপরের কোডটি CSV ফাইলে তৃতীয় কলামটি প্রিন্ট করবে।


1
আমি এটি চেষ্টা করেছি এবং এটি এখনও উদ্ধৃত ক্ষেত্রগুলির মধ্যে কমা বিবেচনা করে।
ড্যানিয়েল সি

5

অন্যান্য উত্তরগুলি ভাল কাজ করে, তবে যেহেতু আপনি কেবল বাশ শেল ব্যবহার করে সমাধান চেয়েছিলেন, আপনি এটি করতে পারেন:

AirBoxOmega:~ d$ cat > file #First we'll create a basic CSV
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10

এবং তারপরে আপনি কলামগুলি (এই উদাহরণের মধ্যে প্রথমটি) এর মতো করে বের করতে পারেন:

AirBoxOmega:~ d$ while IFS=, read -a csv_line;do echo "${csv_line[0]}";done < file
a
1
a
1
a
1
a
1
a
1
a
1

সুতরাং এখানে বেশ কয়েকটি জিনিস চলছে:

  • while IFS=,- এটি আইএফএস (অভ্যন্তরীণ ক্ষেত্র বিভাজক) হিসাবে কমা ব্যবহার করতে বলছে, যা শেলটি ক্ষেত্রগুলি (পাঠ্যের ব্লকগুলি) পৃথক করে তা জানতে ব্যবহৃত হয়। সুতরাং আইএফএস = বলা, "ক, খ" বলা সমান "আই বি" এর মতই যদি আইএফএস = "" হয় (যা এটি ডিফল্টরূপে হয়))

  • read -a csv_line; - এটি প্রতিটি লাইনে একবারে পড়ার কথা বলছে এবং একটি অ্যারে তৈরি করবে যেখানে প্রতিটি উপাদানকে "csv_line" বলা হয় এবং এটি আমাদের লুপের "কর" বিভাগে প্রেরণ করুন

  • do echo "${csv_line[0]}";done < file- এখন আমরা "কর" পর্যায়ে এসেছি এবং আমরা অ্যারে "csv_line" এর 0 ম উপাদানটি প্রতিধ্বনিত করছি। এই ক্রিয়াটি ফাইলের প্রতিটি লাইনে পুনরাবৃত্তি হয়। < fileঅংশ মাত্র যেখানে থেকে পড়তে যখন লুপ কহন হয়। দ্রষ্টব্য: মনে রাখবেন, ব্যাশে, অ্যারেগুলি 0 টি সূচকযুক্ত, তাই প্রথম কলামটি 0 তম উপাদান।

সুতরাং সেখানে আপনার এটি রয়েছে, শেলের সিএসভি থেকে একটি কলাম বের করছে। অন্যান্য সমাধানগুলি সম্ভবত আরও ব্যবহারিক, তবে এটি খাঁটি বাশ b


5

আপনি জিএনইউ আওক ব্যবহার করতে পারেন, ব্যবহারকারীর নির্দেশিকার এই নিবন্ধটি দেখুন । নিবন্ধে উপস্থাপিত সমাধানটির উন্নতি হিসাবে (জুন ২০১৫), নিম্নলিখিত গাউক কমান্ডটি ডাবল উদ্ধৃত ক্ষেত্রগুলির মধ্যে ডাবল উদ্ধৃতিগুলিকে অনুমতি দেয়; একটি ডাবল উদ্ধৃতি সেখানে টানা দুটি ডাবল উদ্ধৃতি ("") দ্বারা চিহ্নিত করা হয়েছে। তদ্ব্যতীত, এটি খালি ক্ষেত্রের অনুমতি দেয়, তবে এটি মাল্টলাইন ক্ষেত্রগুলি পরিচালনা করতে পারে না । নিম্নলিখিত উদাহরণটি c=3টেক্সটফিল.সিএসভি- র তৃতীয় কলামটি (মাধ্যমে ) মুদ্রণ করে:

#!/bin/bash
gawk -- '
BEGIN{
    FPAT="([^,\"]*)|(\"((\"\")*[^\"]*)*\")"
}
{
    if (substr($c, 1, 1) == "\"") {
        $c = substr($c, 2, length($c) - 2) # Get the text within the two quotes
        gsub("\"\"", "\"", $c)  # Normalize double quotes
    }
    print $c
}
' c=3 < <(dos2unix <textfile.csv)

dos2unixসম্ভাব্য ডস স্টাইল লাইন ব্রেক (সিআরএলএফ অর্থাত "\ r \ n") এবং ইউটিএফ -16 এনকোডিং (বাইট অর্ডার চিহ্ন সহ) যথাক্রমে "\ n" এবং ইউটিএফ -8 (বাইট অর্ডার চিহ্ন ছাড়াই) রূপান্তর করার ব্যবহারটি লক্ষ্য করুন । স্ট্যান্ডার্ড সিএসভি ফাইলগুলি লাইন ব্রেক হিসাবে CRLF ব্যবহার করে, উইকিপিডিয়া দেখুন

যদি ইনপুটটিতে একাধিক ক্ষেত্র থাকতে পারে তবে আপনি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন। আউটপুটে রেকর্ডগুলি পৃথক করার জন্য বিশেষ স্ট্রিংয়ের ব্যবহারটি নোট করুন (যেহেতু ডিফল্ট বিভাজক নতুন লাইনটি কোনও রেকর্ডের মধ্যে আসতে পারে)। আবার, নিম্নলিখিত উদাহরণটি c=3textfile.csv এর তৃতীয় কলামটি (মাধ্যমে ) মুদ্রণ করে:

#!/bin/bash
gawk -- '
BEGIN{
    RS="\0" # Read the whole input file as one record;
    # assume there is no null character in input.
    FS="" # Suppose this setting eases internal splitting work.
    ORS="\n####\n" # Use a special output separator to show borders of a record.
}
{
    nof=patsplit($0, a, /([^,"\n]*)|("(("")*[^"]*)*")/, seps)
    field=0;
    for (i=1; i<=nof; i++){
        field++
        if (field==c) {
            if (substr(a[i], 1, 1) == "\"") {
                a[i] = substr(a[i], 2, length(a[i]) - 2) # Get the text within 
                # the two quotes.
                gsub(/""/, "\"", a[i])  # Normalize double quotes.
            }
            print a[i]
        }
        if (seps[i]!=",") field=0
    }
}
' c=3 < <(dos2unix <textfile.csv)

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

csvquote textfile.csv | cut -d ',' -f 3 | csvquote -u

csvquote বড় আকারের ফাইলগুলি প্রক্রিয়াজাতকরণে ব্যবহার করা যেতে পারে।


5

এখানে 2 কলাম সহ সিএসভি ফাইলের উদাহরণ রয়েছে

myTooth.csv

Date,Tooth
2017-01-25,wisdom
2017-02-19,canine
2017-02-24,canine
2017-02-28,wisdom

প্রথম কলামটি পেতে, ব্যবহার করুন:

cut -d, -f1 myTooth.csv

f এর অর্থ ক্ষেত্র এবং d ডিলিমিটার

উপরের কমান্ডটি চালনা করলে নিম্নলিখিত আউটপুট তৈরি হবে।

আউটপুট

Date
2017-01-25
2017-02-19
2017-02-24
2017-02-28

শুধুমাত্র দ্বিতীয় কলামটি পেতে:

cut -d, -f2 myTooth.csv

এবং এখানে আউটপুট আউটপুট

Tooth
wisdom
canine
canine
wisdom
incisor

আরেকটি ব্যবহারের কেস:

আপনার সিএসভি ইনপুট ফাইলটিতে 10 টি কলাম রয়েছে এবং আপনি বিভাজক হিসাবে কমা ব্যবহার করে 2 থেকে 5 এবং 8 টি কলামগুলি করতে চান।

পৃথককারী নির্দিষ্ট করতে কলামগুলি এবং -d (যার অর্থ "ডিলিমিটার") নির্দিষ্ট করতে ব্যবহার করুন -f (অর্থ "ক্ষেত্রগুলি") ব্যবহার করুন। আপনাকে পরবর্তীটি উল্লেখ করতে হবে কারণ কিছু ফাইল কলাম পৃথক করতে স্পেস, ট্যাব বা কলোন ব্যবহার করতে পারে।

cut -f 2-5,8 -d , myvalues.csv

কাট একটি কমান্ড ইউটিলিটি এবং এখানে আরও কয়েকটি উদাহরণ রয়েছে:

SYNOPSIS
     cut -b list [-n] [file ...]
     cut -c list [file ...]
     cut -f list [-d delim] [-s] [file ...]

4

আমার cut/ / awkপ্রার্থনা নয়, উপযুক্ত সিএসভি পার্সিংয়ের দরকার । আমি এটি ম্যাক ছাড়াই চেষ্টা করছি csvtool, তবে ম্যাক্স রুবি নিয়ে আসে, তাই আপনি এটি করতে পারেন:

echo "require 'csv'; CSV.read('new.csv').each {|data| puts data[34]}" | ruby

4

প্রথমে আমরা একটি বেসিক সিএসভি তৈরি করব

[dumb@one pts]$ cat > file 
a,b,c,d,e,f,g,h,i,k  
1,2,3,4,5,6,7,8,9,10  
a,b,c,d,e,f,g,h,i,k  
1,2,3,4,5,6,7,8,9,10

তারপরে আমরা 1 ম কলামটি পাই

[dumb@one pts]$  awk -F , '{print $1}' file  
a  
1  
a  
1

3
csvtool col 2 file.csv 

যেখানে 2 কলামটি আপনার আগ্রহী

আপনি করতে পারেন

csvtool col 1,2 file.csv 

একাধিক কলাম করতে


3

আমি মনে করি সবচেয়ে সহজ সিএসভিকিট ব্যবহার করা হচ্ছে :

২ য় কলাম পান: csvcut -c 2 file.csv

তবে, এখানে সিএসভিটিওল রয়েছে এবং সম্ভবত বেশ কয়েকটি অন্যান্য সিএসভি বাশ সরঞ্জাম রয়েছে:

sudo apt-get install csvtool (ডেবিয়ান-ভিত্তিক সিস্টেমগুলির জন্য)

এটিতে প্রথম সারিতে 'আইডি' থাকা একটি কলাম ফিরে আসবে। csvtool namedcol ID csv_file.csv

এটি চতুর্থ সারিতে ফিরে আসবে: csvtool col 4 csv_file.csv

আপনি যদি শিরোনাম সারি বাদ দিতে চান:

csvtool col 4 csv_file.csv | sed '1d'


2

আমি অবাক হয়েছি কেন এখনও পর্যন্ত উত্তরগুলির মধ্যে কেন সিএসভিকিট উল্লেখ করা হয়নি।

সিএসভিকিট হ'ল সিএসভিতে রূপান্তর ও কাজের জন্য কমান্ড-লাইন সরঞ্জামগুলির একটি স্যুট

csvkit ডকুমেন্টেশন

আমি এটি সিএসভি ডেটা ম্যানেজমেন্টের জন্য একচেটিয়াভাবে ব্যবহার করি এবং এখনও পর্যন্ত আমি এমন কোনও সমস্যা পাইনি যা সিভিস্কিট ব্যবহার করে সমাধান করতে পারিনি।

একটি সিভিএস ফাইল থেকে এক বা একাধিক কলাম আহরণ করতে আপনি csvcutইউটিলিটিটি টুলবক্সের অংশ হিসাবে ব্যবহার করতে পারেন । দ্বিতীয় কলামটি বের করতে এই কমান্ডটি ব্যবহার করুন:

csvcut -c 2 filename_in.csv > filename_out.csv 

csvcut রেফারেন্স পৃষ্ঠা

যদি সিএসভিতে স্ট্রিংগুলি উদ্ধৃত হয় তবে qবিকল্পটির সাথে উদ্ধৃতি অক্ষর যুক্ত করুন :

csvcut -q '"' -c 2 filename_in.csv > filename_out.csv 

সাথে ইনস্টল করুন pip install csvkitবা sudo apt install csvkit



0

এই কোডটি কিছু সময়ের জন্য ব্যবহার করা হয়েছে, আপনি "স্ট্যাকওভারফ্লো থেকে কাটা এবং আটকানো" গণনা না করা "দ্রুত" নয়।

এটি আইএফএসের পরিবর্তে একটি লুপে $ {##} এবং $ {%%} অপারেটর ব্যবহার করে। এটি 'এরর' এবং 'ডাই' বলে ডাকে এবং এসইপি চর হিসাবে কেবল কমা, ড্যাশ এবং পাইপ সমর্থন করে (এটাই আমার দরকার)।

err()  { echo "${0##*/}: Error:" "$@" >&2; }
die()  { err "$@"; exit 1; }

# Return Nth field in a csv string, fields numbered starting with 1
csv_fldN() { fldN , "$1" "$2"; }

# Return Nth field in string of fields separated
# by SEP, fields numbered starting with 1
fldN() {
        local me="fldN: "
        local sep="$1"
        local fldnum="$2"
        local vals="$3"
        case "$sep" in
                -|,|\|) ;;
                *) die "$me: arg1 sep: unsupported separator '$sep'" ;;
        esac
        case "$fldnum" in
                [0-9]*) [ "$fldnum" -gt 0 ] || { err "$me: arg2 fldnum=$fldnum must be number greater or equal to 0."; return 1; } ;;
                *) { err "$me: arg2 fldnum=$fldnum must be number"; return 1;} ;;
        esac
        [ -z "$vals" ] && err "$me: missing arg2 vals: list of '$sep' separated values" && return 1
        fldnum=$(($fldnum - 1))
        while [ $fldnum -gt 0 ] ; do
                vals="${vals#*$sep}"
                fldnum=$(($fldnum - 1))
        done
        echo ${vals%%$sep*}
}

উদাহরণ:

$ CSVLINE="example,fields with whitespace,field3"
$ $ for fno in $(seq 3); do echo field$fno: $(csv_fldN $fno "$CSVLINE");  done
field1: example
field2: fields with whitespace
field3: field3

0

আপনি লুপ করার সময়ও ব্যবহার করতে পারেন

IFS=,
while read name val; do
        echo "............................"

        echo Name: "$name"
done<itemlst.csv

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