একটি বৃহত সিএসভি ফাইল পুনর্নির্মাণ করা হচ্ছে


11

আমি উত্তর মাধ্যমে গিয়েছিলাম এই সহায়ক থ্রেড , কিন্তু আমার সমস্যা বিভিন্ন যথেষ্ট যে আমি ভাল উত্তর (অন্তত সঙ্গে মনে করতে পারেন না মনে করা হয় sed)।

নীচের মতো দেখতে সারিগুলির সাথে আমার কাছে একটি বৃহত সিএসভি ফাইল (200+ গিগাবাইট) রয়েছে:

<alphanumerical_identifier>,<number>

যেখানে <alphanumerical_identifier>পুরো ফাইল জুড়ে অনন্য। আমি একটি পৃথক ফাইল তৈরি করতে চাই যা প্রথম কলামকে সূচক দ্বারা প্রতিস্থাপন করে , অর্থাত্‍

<index>,<number>

যাতে আমরা পাই:

1, <number>
2, <number>
3, <number>

awkমেমরিতে পুরো ফাইলটি লোড না করে একটি বর্ধমান সূচক তৈরি করতে পারে ?

যেহেতু সূচক একঘেয়েভাবে বৃদ্ধি পায়, কেবল সূচকটি বাদ দেওয়া আরও ভাল। এর সমাধান কি আলাদা হবে?, যেমন:

<number>
<number>
<number>

আমি এই সমাধানটির সম্ভাব্যতা সম্পর্কে নিশ্চিত নই। তবে কীভাবে কেবল একটি পৃথক ফাইলে সিএসভি ফাইলে যতগুলি সংখ্যা তৈরি করা যায় এবং তারপরে কেবল সেই ফাইলটিতে সিএসভি ফাইলের দ্বিতীয় কলাম যুক্ত করা যায়?
রমেশ

@ রামেশ যতক্ষণ না আউটপুট সঠিক ততক্ষণ ঠিক আছে।
অ্যামিলিও ওয়াজকেজ-রেইনা

2
আমার সন্দেহ হয় আমি কিছু ভুল বুঝছি; অন্যথায়, awk -F, '{print ++n, $2}'কাজ করবে। বা awk -F, '{print $2}'দ্বিতীয় প্রকরণের জন্য।
জি-ম্যান

2
@ জি-ম্যান, সম্ভবত এটি FNRঠিক তত ভালভাবে কাজ করবে++n
ইরুবার

1
আমি ট্রিপল-চেক করব যে আপনি সত্যিই সেই ইউনিক আইডেন্টিফায়ার থেকে মুক্তি পেতে পারেন ... কেন সূচির সাথে প্রথম (তৃতীয়) কলাম যুক্ত করবেন না, তবে এখনও সনাক্তকারী রাখবেন? সেই পরিচয়কর্তা অন্য কোথাও ব্যবহার করা হয়নি ?
অলিভিয়ার ডুলাক

উত্তর:


13

পরীক্ষার জন্য টার্মিনালের কাছাকাছি নয়, তবে thet-overlooked nlকমান্ড সম্পর্কে কী হবে? কিছুটা এইরকম:

cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv


1
পিএস: একটি 200 গিগাবাইট সিএসভি ফাইল? বাহ, এবং আমি ভেবেছিলাম উত্তর আমেরিকান পোর্টড নম্বর ডাটাবেসের সাথে সিএসভি হিসাবে কাজ করা (বেশ কয়েকটি ডিভিডি) বিশাল ছিল!
বিশপ

1
এটি কাজ করে, যদিও সংখ্যার পরে বড় ফাঁকা থাকে। আমি এটি দিয়ে প্রতিস্থাপন করব:cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
অ্যাঙ্গেল

@ অ্যাঞ্জেল: ধন্যবাদ, -w 1বাম-সংখ্যার পরিবর্তে প্রস্থ বিকল্পটি ব্যবহার করতে আমার উত্তর আপডেট করেছে ।
বিশপ

ধন্যবাদ @ বিশপ - ইনপুট এবং আউটপুট ফাইলের নাম কোথায় যায়?
আমেলিও ওয়াজকেজ-রেইনা

1
@ user815423426 হ্যাঁ, cutপাইপ প্রতীক ( |) এর আগে কমান্ডটি আপনাকে কেবল দ্বিতীয় কলাম দেবে, কার্যকরভাবে অন্তর্ভুক্ত রেখার সংখ্যা থাকবে।
বিশপ 20

7

এখানে কয়েকটি পন্থা দেওয়া হয়েছে, তবে উপরের cutএবং nlসমাধানের গতিতে কোনওটিই আসতে পারবে না :

  1. awk

    awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
  2. পার্ল

    perl -pe 's/[^,]+/$./' file.csv > newfile.csv

    অথবা

    perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
  3. শেল (তবে আমি এটি 200 জি ফাইলের জন্য প্রস্তাব দিচ্ছি না, এটি বয়স নিতে হবে)

    i=1; while IFS=, read foo num; do 
            printf "%d,%s\n" $((i++)) $num; 
    done < file.csv > newfile.csv

উপরের সমাধানগুলি গতি অনুসারে বাছাই করা হয়। আমি আমার ল্যাপটপ এবং একটি 40 এম ফাইল পরীক্ষা করেছিলাম এবং তারা শেলটির জন্য (10 রান গড়ে) 2.2282 (অ্যাডব্লিউ), 2.4555 (1 ম পারল), 3.1825 (দ্বিতীয়বারের পার্ল) এবং তীব্র 48.6035s নিয়েছি। আপনার ইতিমধ্যে খুব চালাক cutএবং nlসমাধানটি 0.6078 এর দশকে প্রায় 4 গুণ বেশি দ্রুত ছিল।


সুন্দর, পরিসংখ্যানের জন্য ধন্যবাদ! শেলের ফলাফল আমাকে কিছুটা অবাক করে দেয়। আপনি যদি এর সাথে প্রতিস্থাপন printfকরেন echo, সময় কি উল্লেখযোগ্যভাবে উন্নতি করবে?
বিশপ 1

2
40G ফাইলটি 2.2282 সেকেন্ডে প্রক্রিয়া করা হবে? আমাকে কোথায় পাওয়া যাবে?
জন বি

2
@ জনবি উম্ম, হ্যাঁ, দুঃখিত, এটি
জিএম

আমি $1সাথে যোগাযোগ পুনরায় সেট করতে পছন্দ করি awkcutসমাধান স্পষ্টভাবে অনেক দ্রুত হয়, কিন্তু যে হিসাবে এটি প্রতিস্থাপন না হবে বলে আশা করা হচ্ছে <alphanumerical_identifier>কিছু দিয়ে। আমি মনে করি দ্রুততম awkবৈকল্পিক ভালো কিছু হতে পারে: mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
জন বি

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