এক .csv থেকে অন্য .csv ফাইলে কলাম যুক্ত করুন


12

file1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

file2.csv

A,B
A,B
A,B
A,B

পছন্দসই আউটপুট.সিএসভি

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

আমি "যোগদান" এবং "পেস্ট" ব্যবহার করার চেষ্টা করেছি কোনও লাভ হয়নি। এটি করার জন্য কোনও বাশ আদেশ আছে? উভয় .csvফাইলে কলাম "এ" সমান ।


সুতরাং আপনি কলাম বি 1 ফাইল 1 অনুলিপি করতে বলছেন? অথবা কলাম এবং সি 2 তে ফাইল 2?
টিম

যতক্ষণ না আউটপুট "পছন্দসই আউটপুট সিএসভি" এর সাথে মেলে ততক্ষণ ঠিক থাকবে
রোবম্যান 1723

আমি একটি নতুন উত্তর যুক্ত করেছি, যা আমি মনে করি, অন্যান্য উত্তরগুলির চেয়ে সহজ (আমার প্রথম উত্তর অন্তর্ভুক্ত)। আপনি এটি গ্রহণ করতে বিবেচনা করতে পারেন যাতে ভবিষ্যতের রেফারেন্সের জন্য তথ্য সহজেই পাওয়া যায়।
don.joey

উত্তর:


11

শুধুমাত্র awkআদেশ সহ:

awk -F, '{getline f1 <"file2" ;print f1,$3,$4}' OFS=, file1

ফাইল 1 থেকে একটি লাইন পান এবং এটি স্থানীয় ভেরিয়েবলের মধ্যে সঞ্চয় করুন f1, তারপরে লাইনটি মুদ্রণ করুন f1এবং শেষ পর্যন্ত ফাইল 1 থেকে তৃতীয় ( $3) এবং এগিয়ে ( $3) ক্ষেত্রগুলি মুদ্রণ করুন যা ,সম্পূর্ণরূপে কমা দিয়ে বিস্মৃত হয়েছিল এবং অফসটি পরিবর্তন করে (আউটপুট ফিল্ড বিভাজক [স্থান দ্বারা স্থান) ডিফল্ট]) থেকে কমা ( ,)।


শর্ট কমান্ডটি এরকম হবে:

paste -d, file2 <(cut -d, -f3- file1)
 এ বি সি ডি  
 এ বি সি ডি  
 এ বি সি ডি  
 এ বি সি ডি  

ফাইল 2 টি পেস্ট করুন, তারপরে -f3-ফাইল 1 থেকে তৃতীয় কলামটি পরবর্তী ( ) এ পেস্ট করুন ।


সহ awkএবং paste(বিকল্প এ)

কমান্ডের নীচে C,Dফাইল 2 এ প্রতিটি লাইনের শেষে ফাইল 1 থেকে শেষ দুটি কলাম ( ) অনুলিপি করা হয়েছে:

paste -d',' file2  <(awk -F',' '{print $(NF-1)","$NF}' file1)

কমান্ড উপরে পেস্ট file2 বিষয়বস্তু তারপর একটি কমা বিভেদক (মুদ্রণ -d',') তারপর দুই গত ক্ষেত্র পেস্ট ( NFগত ক্ষেত্রের সূচক এবং $NFস্ট্রিং যা তার সূচক হল NF। সুতরাং $(NF-1)গত ক্ষেত্র সামনে দ্বিতীয় ক্ষেত্র) file1 থেকে যখন সেই সূচক redefines বা কমা দর্শকের সাথে বিভক্ত ( -F',')।

সহ awkএবং paste(বিকল্প বি)

এই কমান্ডটিও উপরের মত ( $3এবং $4ফাইল 1 থেকে প্রতিটি লাইনের তৃতীয় এবং সামনের ক্ষেত্রের দিকে নির্দেশ করে):

paste -d',' file2  <(awk -F',' '{print $3","$4}' file1)

অথবা cutকমান্ড সহ আরও একটি সমাধান :

paste -d, <(cut -d, -f1 file1) <(cut -d, -f2 file2) <(cut -d, -f3- file1)

কাটা উপরোক্ত কমান্ডে কমান্ড প্রথম প্রথম ক্ষেত্র (কাটা -f1যা কমা বিভেদক (সঙ্গে সূচীবদ্ধ -d.file1 (থেকে)) cut -d, -f1 file1), তারপর কেটে file2 (দ্বিতীয় ক্ষেত্র পেস্ট cut -d, -f2 file2) এবং পরিশেষে কেটে তৃতীয় কলাম (পেস্ট -f3) nexts করার জন্য ( -) ফাইল 1 ( cut -d, -f3- file1) থেকে আবার।

এই কমান্ড একই ফলাফল প্রদান করে:

paste -d, <(awk -F',' '{print $1}' file1) <(awk -F',' '{print $2}' file2) <(awk -F',' '{print $3","$4}' file1)

ফাইল 1 ( awk -F',' '{print $1}' file1) থেকে দ্বিতীয় ক্ষেত্রটি পেস্ট করুন তারপরে কমা মুদ্রণ করুন ( -d,), তারপরে ফাইল 2 ( ) থেকে দ্বিতীয় কলামটি awk -F',' '{print $2}' file2পেস্ট করুন, শেষ পর্যন্ত ফাইল 1 ( awk -F',' '{print $3","$4}' file1) এর দ্বিতীয় এবং শেষ কলামটি আবার পেস্ট করুন ।


@ কাসি আপনি এয়ার্কের মাধ্যমেই এটি করতে পারবেন। স্ট্যাকওভারফ্লো
অবিনাশ রাজ

9

এখানে একটি সৌন্দর্য (আমি মনে করি):

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

পদক্ষেপে ভেঙে গেছে:

পদক্ষেপ 1. সিএসভিকিট ইনস্টল করুন:

sudo pip install csvkit
sudo apt-get install python-dev python-pip python-setuptools build-essential

পদক্ষেপ 2. বিভাজক হিসাবে কমা দিয়ে যোগ কমান্ডটি ব্যবহার করুন

join -t,

পদক্ষেপ ৩. আপনি যে প্রকৃত কলামগুলি চান তা এটি ফিড করুন। আপনি কীভাবে এটি প্রথম কলামটিকে দুবার খাওয়ান তা নোট করুন, কারণ এটিই হ'ল যোগদানটি আসলে সম্পাদিত হয় (এর ডিফল্ট আচরণ join)।

join -t, <(csvcut --columns 1,3,4 file1.csv) <(csvcut --columns 1,2 file2.csv)

বা সংক্ষেপে:

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

আপনি চাইলে সেই মানক আউটপুটটিকে কোনও ফাইলে (কাঙ্ক্ষিত আউটপুট) পুনর্নির্দেশ করতে পারেন।

সুবিধাদি

প্রস্তাবিত অন্যদের চেয়ে এই পদ্ধতিটির বেশ কয়েকটি সুবিধা রয়েছে।

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

দ্বিতীয়ত, এটি অত্যন্ত শক্তিশালী সিএসভি টুলকিট ব্যবহার করে যা আপনাকে ক) কমান্ডের সাহায্যে পরিসংখ্যান প্রদর্শন করে ( csvstats), খ) ডেটা পরিষ্কার কিনা তা যাচাই করে ( csvclean), তবে এটি জেসন, স্কুএলে রূপান্তর করতে, এমনকি এমনকি এটিতে লোডও করতে পারে পাইথন! এই টুলকিট ডেটা প্রস্তুতির জন্য ডেটা সায়েন্সে ভারী ব্যবহৃত হয়।


আপনি যদি উবুন্টুতে ইনস্টল করছেন তবে সিএসভিকিট ইনস্টল করার আগে আপনাকে পাইথন ডেভলপমেন্ট হেডারগুলি ইনস্টল করতে হবে: sudo apt-get install python-dev python-pip python-setuptools build-essential- লিঙ্ক
কারেল

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

CSV ডেটার জন্য আমাকে অন্য একটি সরঞ্জাম দেখানোর জন্য +1 পৃথক প্রশ্ন, কিন্তু আপনি কি CSV ডেটা ফাইলের জন্য স্বতন্ত্র প্রতিবেদন লেখক সম্পর্কে জানেন?
জো

@ জো আপনি যখন কোনও 'রিপোর্টার লেখক' সম্পর্কে কথা বলছেন তখন আপনি কী বোঝাতে চেয়েছেন সে সম্পর্কে আপনি আরও নির্দিষ্ট হতে পারেন? আমি নিশ্চিত না যে আপনি কী বলতে চাইছেন তা আমি বুঝতে পেরেছি।
don.joey


7

এখানে আরও একটি সুন্দর। আমি মনে করি এটি এখন পর্যন্ত সমস্ত পরামর্শগুলির মধ্যে সবচেয়ে সহজ।

csvtool pastecol 2 2 file1.csv file2.csv

আপনি যদি অতীতে ইতিমধ্যে csvtool ইনস্টল না করে থাকেন তবে আপনাকে তা করতে হবে sudo apt-get install csvtool

ডক্স থেকে:

pastecol <column-spec1> <column-spec2> input.csv update.csv

ফাইল ইনপুট.সিএসভি-তে উল্লিখিত কলামগুলির বিষয়বস্তুকে আপডেট.সিএসভিতে উল্লিখিত সংশ্লিষ্ট কলামগুলির সাথে প্রতিস্থাপন করুন।

উদাহরণ:

  csvtool pastecol 2-3 1- input.csv update.csv.csv > output.csv

আমাদের ক্ষেত্রে কীভাবে আমরা ফাইলগুলির দ্বিতীয় কলাম প্রতিস্থাপন করছি তা নোট করুন।

উদাহরণ

file1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

file2.csv

A,B
A,B
A,B
A,B

দুটি ফাইলের সংমিশ্রণ:

csvtool pastecol 2 2 file1.csv file2.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

আপনি যা করেন তা হ'ল file2.csvকলাম 2 এর হিসাবে কলাম দুটি আটকান file1.csv

নোট করুন যে এটি একই নথিতেও কাজ করে। আপনি যদি দুটি কলাম পরিবর্তন করতে চান, আপনি একই ফাইল ইনপুট সিএসভি এবং আপডেট.vsc ব্যবহার করে করতে পারেন।

csvtool pastecol 2 1 file2.csv file2.csv 
A,A
A,A
A,A 
A,A

সন্দেহ নেই সবচেয়ে মার্জিত।
জ্যাকব ভিলিজ

2

নির্বাচিত সংখ্যক কলামগুলি একটি ফাইল থেকে অন্য ফাইলটিতে স্থানান্তর করতে:

#!/usr/bin/env python3

cols = 1; file_1 = "/path/to/file_1"; file_2 = "/path/to/file_2"

def readfile(file):
      with open(file) as src:
          return [item.strip().split(",") for item in src.readlines()]

file_1 = readfile(file_1); file_2 = readfile(file_2)

for i in range(len(file_1)):
    print((",").join(file_1[i]+file_2[i][-cols:]))

দুটি ফাইল থেকে:

file_1

A,B
A,B
A,B
A,B

file_2

K,L,M
K,L,M
K,L,M
K,L,M

আপনি যখন সেট করবেন cols = 1:

A,B,M
A,B,M
A,B,M
A,B,M

তবে আপনি যখন সেট করবেন cols = 2:

A,B,L,M
A,B,L,M
A,B,L,M
A,B,L,M

cols = 3:

A,B,K,L,M
A,B,K,L,M
A,B,K,L,M
A,B,K,L,M

কিভাবে ব্যবহার করে

একটি খালি ফাইল সেটিকে কপি পাথ সেট file1, file2এবং কলামের সংখ্যা হিসাবে এটি সংরক্ষণ সরাতে, এর move.pyদ্বারা এটি চালানোর:

python3 /path/to/move.py

উত্স ফাইলের কলমের মাঝামাঝি থেকে এভাবে এক বা একাধিক কলাম যুক্ত করাও সম্ভব।


আপনি import csvযদিও ব্যবহার দেখতে ভাল লাগত।
don.joey

@ don.joey পরামর্শ দেওয়ার জন্য ধন্যবাদ, অবশ্যই এটি দেখতে হবে।
জ্যাকব ভ্লিজম

0

সিএসভি মডিউলটির মাধ্যমে পাইথনের আরও একটি পদ্ধতি।

script.py

#!/usr/bin/python3
import csv
import sys
file1 = sys.argv[1]
file2 = sys.argv[2]
with open(file2, 'r') as r:
    with open(file1, 'r') as f:
        csv_f = csv.reader(f)
        csv_r = csv.reader(r)
        bar = [linex for linex in csv_r]
        foo = [liney[2:] for liney in csv_f]
        zipped = zip(bar,foo)
        result = [x+y for (x,y) in list(zipped)]
        for i in result:
            print(','.join(i))

উপরের স্ক্রিপ্টটি চালাতে,

python3 script.py file1 file2

আউটপুট:

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.