বিশাল ফাইল থেকে বিপুল সংখ্যক নিদর্শনগুলি গ্রেপ করুন


18

আমার কাছে একটি ফাইল রয়েছে যা দিনে প্রায় 200,000 লাইন বাড়ছে, এবং এটি সমস্ত তিনটি লাইনের ব্লক দিয়ে গঠিত:

1358726575123       # key
    Joseph Muller   # name
    carpenter       # job
9973834728345
    Andres Smith
    student
7836472098652
    Mariah Anthony
    dentist

এখন, আমার কাছে অন্য একটি ফাইল রয়েছে যা থেকে আমি প্রায় 10,000 কী নিদর্শনগুলি বের করি 1358726575123। তারপরে আমি forএই নিদর্শনগুলির সাথে একটি লুপ চালাচ্ছি এবং তাদের প্রথম ফাইলের বিপরীতে পরীক্ষা করতে হবে। যদি ফাইলটিতে এমন প্যাটার্ন না থাকে তবে আমি আরও প্রক্রিয়াকরণের জন্য তৃতীয় ফাইলে প্যাটার্নটি সংরক্ষণ করি:

for number in $(grep -o '[0-9]\{12\}' file2); do  # finds about 10.000 keys
     if ! grep -q ^$number$ file1; then           # file1 is a huge file
         printf "$number\n" >>file3               # we'll process file3 later
     fi
done

উদাহরণস্বরূপ কোড বিপুল ফাইল greps 10,000 বার, এবং আমি এই লুপ চালানোর পুরো দিনের বেলা এক মিনিট একবার

যেহেতু বিশাল ফাইলটি বাড়তে থাকে তাই আমি এই সমস্ত দ্রুত করতে এবং কিছু সিপিইউ সংরক্ষণ করতে কী করতে পারি? আমি ভাবছি যে ফাইলটি কোনওভাবে এর কী দ্বারা বাছাই করা হয়েছে (যদি তা হয় তবে কীভাবে?) বা সরল পাঠ্যের পরিবর্তে একটি ডিবি ব্যবহার করা সাহায্য করবে ...


এই পোস্টটি দেখুন: বাশ
কোডফোরস্টার

উত্তর:


11

এই উত্তরটি পোটংawk পোস্ট করা উত্তরের উপর ভিত্তি করে .. প্রধান ফাইলে একই 10 মিলিয়ন লাইন এবং 10 হাজার কীগুলির জন্য (এটি আমার সিস্টেমে) পদ্ধতির দ্বিগুণ দ্রুত ... (এখন এফএনআর ব্যবহারের জন্য আপডেট হয়েছে, নোট প্রত্যার্পণ)
comm

যদিও awkআপনার বর্তমান সিস্টেমের চেয়ে দ্রুতগতি, এবং আপনাকে এবং আপনার কম্পিউটারকে (গুলি) কিছুটা শ্বাস প্রশ্বাসের জায়গা দেবে, সচেতন থাকুন যখন ডেটা প্রসেসিং আপনার বর্ণনার মতো তীব্র হয়, আপনি ডেডিকেটেড ডেটাবেজে স্যুইচ করে সেরা সামগ্রিক ফলাফল পাবেন; যেমন। এসকিউলেট, মাইএসকিউএল ...


awk '{ if (/^[^0-9]/) { next }              # Skip lines which do not hold key values
       if (FNR==NR) { main[$0]=1 }          # Process keys from file "mainfile"
       else if (main[$0]==0) { keys[$0]=1 } # Process keys from file "keys"
     } END { for(key in keys) print key }' \
       "mainfile" "keys" >"keys.not-in-main"

# For 6 million lines in "mainfile" and 10 thousand keys in "keys"

# The awk  method
# time:
#   real    0m14.495s
#   user    0m14.457s
#   sys     0m0.044s

# The comm  method
# time:
#   real    0m27.976s
#   user    0m28.046s
#   sys     0m0.104s


এটি দ্রুত, তবে আমি অজানা কিছু বুঝতে পারি না: ফাইলের নামগুলি দেখতে কেমন হওয়া উচিত? আমি চেষ্টা file1 -> mainfileএবং file2 -> keysহাবা এবং mawk সঙ্গে, এবং এটা ভুল চাবি আউটপুট।
তেরেসা ই জুনিয়র

file1 এর কী, নাম এবং কাজ রয়েছে।
টেরেসা ই জুনিয়র

'মেইনফিল' হ'ল বড় ফাইল (কী, নাম এবং কাজ সহ)। আমি কেবল এটিকে "মেইনফিল" বলেছি কারণ আমি কোন ফাইলটি মিশ্রিত করতে থাকি (ফাইল 1 বনাম ফাইল 2) .. 'কী'গুলিতে কেবল 10 হাজার বা আরও অনেকগুলি কী রয়েছে your আপনার পরিস্থিতিটি কোনও কারণে পুনর্নির্দেশ করবেন না । .. শুধু ব্যবহার file1 ফাইলের শেষে file2 এইগুলি হল নাম আপনার ফাইল .. "ফাইলের শেষে" স্ক্রিপ্ট দ্বারা একটি 1-লাইন ফাইল creadte প্রথম ফাইলটি শেষে (প্রধান তথ্য ফাইল) এবং Teh দ্বিতীয় ফাইল শুরুর ইঙ্গিত আছে ( কী) awkstdout
.আপনি

এই স্ক্রিপ্টটি কোন কী যা বর্তমানে রয়েছে প্রিন্ট হবে mainfile, এবং এটি থেকে কোন কী প্রিন্ট হবে keysফাইল যা হয় নাmainfile... যে সম্ভবত কী ঘটছে তা ... (আমি আরো তা একটু সন্ধান করব ... এর
পিটার.ও

আপনাকে ধন্যবাদ, পিটার.ও! যেহেতু ফাইলগুলি গোপনীয়, তাই $RANDOMআপলোড করার জন্য আমি নমুনা ফাইল তৈরি করার চেষ্টা করছি ।
তেরেসা ই জুনিয়র

16

সমস্যাটি অবশ্যই, আপনি বড় ফাইলটিতে 10,000 বার গ্রেপ চালান। আপনার দু'টি ফাইলই একবার পড়া উচিত। আপনি যদি স্ক্রিপ্টিং ভাষার বাইরে থাকতে চান তবে আপনি এটি এইভাবে করতে পারেন:

  1. 1 নম্বর ফাইল থেকে সমস্ত সংখ্যা বের করুন এবং তাদের বাছাই করুন
  2. ফাইল 2 থেকে সমস্ত সংখ্যা বের করুন এবং তাদের বাছাই করুন
  3. commকেবল দ্বিতীয় তালিকায় যা আছে তা পেতে বাছাই করা তালিকাগুলি চালান

এটার মতো কিছু:

$ grep -o '^[0-9]\{12\}$' file1 | sort -u -o file1.sorted
$ grep -o  '[0-9]\{12\}'  file2 | sort -u -o file2.sorted
$ comm -13 file1.sorted file2.sorted > file3

দেখুন man comm

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


1
ঝরঝরে! মেইনফাইলে 200,000 এলোমেলো রেখার প্রবেশদ্বার (উদাহরণস্বরূপ 600,000 লাইন) সহ 2 সেকেন্ড (বিশেষত দ্রুত ড্রাইভগুলিতে নয়) এবং 143,000 এলোমেলো কীগুলি (এটি আমার টেস্টের ডেটা শেষ হয়ে যায় ঠিক তেমন) ... পরীক্ষিত, এবং এটি কাজ করে (তবে আপনি তা জানতেন: ) ... আমি বিস্মিত হয়েছি {12}.. ওপি 12 টি ব্যবহার করেছে তবে উদাহরণ কীগুলি 13 টি দীর্ঘ ...
পিটার.ও

2
কেবলমাত্র একটি সামান্য নোট, আপনি <(grep...sort)ফাইলের নাম কোথায় রয়েছে তা ব্যবহার করে অস্থায়ী ফাইলগুলি না নিয়েই এটি করতে পারেন ।
কেভিন

আপনাকে ধন্যবাদ, তবে গ্রেপিং এবং ফাইলগুলি বাছাই করা আমার আগের লুপের (+ 2 মিনিট।) থেকে অনেক বেশি সময় নেয়।
টেরেসা ই জুনিয়র

@ তেরেসা ই জুনিয়র আপনার মূল ফাইলটি কত বড়? ... আপনি উল্লেখ করেছেন যে এটি দিনে 200,000 লাইনে বৃদ্ধি পায় তবে এটি কতটা বড় তা নয় ... আপনি যে ডেটা প্রক্রিয়া করতে চান তার পরিমাণ হ্রাস করতে আপনি কেবল বর্তমান দিনের 200,000 লাইন পড়তে পারেন একটি নোট গ্রহণ করে প্রক্রিয়াজাত সর্বশেষ লাইন নম্বর (গতকাল) এবং tail -n +$linenumশুধুমাত্র সর্বশেষতম ডেটা আউটপুট ব্যবহার করে। এইভাবে আপনি প্রতিদিন প্রায় 200,000 লাইন প্রক্রিয়াকরণ করবেন .. আমি কেবল এটি প্রধান-ফাইলে 6 মিলিয়ন লাইন এবং 10 হাজার কীগুলির সাথে পরীক্ষিত করেছি ... সময় : আসল 0m0.016 গুলি, ব্যবহারকারীর 0m0.008s, 0x0.008s
পিটার.ও

আপনি কীভাবে আপনার মূল ফাইলটি ১০,০০০ বার গ্রেপ করতে পারেন এবং এই পদ্ধতির চেয়ে দ্রুত এটি খুঁজে পেতে পারেন তা সম্পর্কে আমি সত্যিই বেশ আশ্চর্য / কৌতূহলবশত: এটি একবারে গ্রিপ করে (এবং একবারে আরও ছোট ফাইল 1 এর জন্য ) ... এমনকি যদি আপনার সাজানটি আমার চেয়ে বেশি সময় নেয় পরীক্ষা, আমি কেবল এই ধারণাটি নিয়ে মাথা পেতে পারি না যে একটি বড় ফাইল পড়া যা একাধিকবার এক সময় (সময়ের সাথে) ছাড়িয়ে যায় না
পিটার.ও

8

হ্যাঁ, অবশ্যই একটি ডেটাবেস ব্যবহার করবেন। এগুলি ঠিক এই জাতীয় কাজের জন্য তৈরি করা হয়েছে।


ধন্যবাদ! ডেটাবেস নিয়ে আমার খুব বেশি অভিজ্ঞতা নেই। আপনি কোন ডাটাবেস সুপারিশ করবেন? আমি মাইএসকিউএল এবং sqlite3 কমান্ড ইনস্টল করা আছে।
টেরেসা ই জুনিয়র

1
এগুলির জন্য তারা উভয়ই ঠিক আছে, স্ক্লাইট সহজেই সহজ কারণ এটি অ্যাক্সেস করার জন্য এটি কেবল একটি ফাইল এবং একটি এসকিউএল এপিআই। মাইএসকিউএল ব্যবহার করার জন্য আপনাকে একটি মাইএসকিউএল সার্ভার সেট আপ করতে হবে। যদিও এটি খুব কঠিন নয় তবে স্ক্লাইটটি দিয়ে শুরু করা ভাল।
মিকা ফিশার

3

এটি আপনার পক্ষে কাজ করতে পারে:

 awk '/^[0-9]/{a[$0]++}END{for(x in a)if(a[x]==1)print x}' file{1,2} >file3

সম্পাদনা করুন:

উভয় ফাইলে নকল এবং অজানা কীগুলির অনুমতি দেওয়ার জন্য সংশোধিত স্ক্রিপ্টটি এখনও দ্বিতীয় ফাইলটিতে উপস্থিত না থেকে প্রথম ফাইলটি থেকে কীগুলি তৈরি করে:

 awk '/^[0-9]/{if(FNR==NR){a[$0]=1;next};if($0 in a){a[$0]=2}}END{for(x in a)if(a[x]==1)print x}' file{1,2} >file3

এটি নতুন ফাইলগুলি মিস করবে যা মূল ফাইলে একাধিকবার সংঘটিত হয় (এবং সেই বিষয়টির জন্য, যা কীগুলির ফাইলে একাধিকবার ঘটেছে) মনে হয় মূল ফাইলটির অ্যারে গণনা বৃদ্ধি 1 এর বেশি হবে না, বা কিছু সমতুল্য কাজ (+1 কারণ এটি চিহ্নের খুব কাছেই রয়েছে)
পিটার.ও

1
আমি গাওক এবং মাক দিয়ে চেষ্টা করেছি, এবং এটি ভুল কীগুলি প্রকাশ করে ...
টেরেসা ই জুনিয়র

@ পিটার.ওআই ধরে নিলাম মূল ফাইলটির অনন্য কী রয়েছে এবং সেই ফাইলটি 2 মূল ফাইলটির একটি উপসেট ছিল।
পোটং

@ পোটং দ্বিতীয়টি ভাল এবং খুব দ্রুত কাজ করে! ধন্যবাদ!
তেরেসা ই জুনিয়র

@ টেরেসা ই জুনিয়র আপনি কি নিশ্চিত যে এটি এখনও সঠিকভাবে কাজ করছে? .. আপনি যে টেস্ট ডেটা সরবরাহ করেছেন তা ব্যবহার করে , যেটি 5000 টি কী ব্যবহার করে, এটি চালানোর সময় এটি 136703 কী তৈরি করে , যতক্ষণ না অবশেষে আমি বুঝতে পারি যে আপনার প্রয়োজনীয়তাগুলি কী ... @ পটং অবশ্যই! এফএনআর == এনআর (আমি এর আগে কখনও ব্যবহার করিনি :)
পিটার.ও

2

এত বেশি ডেটা সহ, আপনার সত্যিকারের কোনও ডাটাবেসে স্যুইচ করা উচিত। ইতিমধ্যে, শালীন পারফরম্যান্সের কাছাকাছি যাওয়ার জন্য আপনাকে অবশ্যই একটি কাজটি করতে হবে তা file1প্রতিটি কি জন্য আলাদাভাবে অনুসন্ধান করা নয় । grepএকবারে সমস্ত বাদ না থাকা কীগুলি বের করার জন্য একটি একক চালান । যেহেতু এটি grepএমন লাইনগুলিও দেয় যাতে কোনও কী থাকে না, সেগুলি ফিল্টার করে।

grep -o '[0-9]\{12\}' file2 |
grep -Fxv -f - file1 |
grep -vx '[0-9]\{12\}' >file3

(এর -Fxঅর্থ পুরো লাইনগুলি অনুসন্ধান করা, আক্ষরিক অর্থে -f -স্ট্যান্ডার্ড ইনপুট থেকে নিদর্শনগুলির একটি তালিকা পড়া means


যতক্ষণ না আমি ভুল হয়ে থাকি, এটি বড় ফাইলের মধ্যে নেই এমন কীগুলি সংরক্ষণের সমস্যাটির সমাধান করে না, এটি এতে থাকা কীগুলি সংরক্ষণ করবে।
কেভিন

@ কেভিন ঠিকমতো, এবং এটি আমাকে লুপটি ব্যবহার করতে বাধ্য করেছে।
টেরেসা ই জুনিয়র

@ তেরেসি জুনিয়র: যোগ করা -v( -Fxv) এটির যত্ন নিতে পারে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস উইলিয়ামসন এটি বড় ফাইলের সমস্ত লাইন বেছে নেবে যা কী, ফাইল, নাম, ইত্যাদি সহ কোনও ফাইলের সাথে মেলে না
কেভিন

@ কেভিন ধন্যবাদ, আমি প্রশ্নটি ভুল করে লিখছি। আমি নন-কী লাইনগুলির জন্য একটি ফিল্টার যুক্ত করেছি, যদিও আমার পছন্দটি এখন ব্যবহারেcomm যায় ।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

2

আমাকে অন্যরা যা বলেছে, তাকে শক্তিশালী করার অনুমতি দিন, "আপনাকে একটি ডাটাবেসে নিয়ে যাও!"

আছে মাইএসকিউএল সবচেয়ে প্ল্যাটফর্মের জন্য সহজলভ্য বাইনেরিতে।

এসকিউএলাইট কেন নয়? এটি মেমরি-ভিত্তিক, যখন আপনি এটি শুরু করেন তখন একটি ফ্ল্যাট-ফাইল লোড করা হয়, তারপরে আপনার কাজ শেষ হয়ে গেলে এটি বন্ধ করে দেওয়া হয়। এর অর্থ হ'ল যদি আপনার কম্পিউটার ক্রাশ হয়ে যায় বা এসকিউএলাইট প্রক্রিয়াটি চলে যায় তবে সমস্ত ডেটা হয়।

আপনার সমস্যাটি কেবলমাত্র এসকিউএল-এর কয়েকটি লাইন দেখে মনে হচ্ছে এবং এটি মিলি সেকেন্ডে চলবে!

মাইএসকিউএল ইনস্টল করার পরে (যা আমি অন্যান্য পছন্দগুলির তুলনায় সুপারিশ করি), আমি অ্যান্টনি মোলিনারো দ্বারা ও'রিলির এসকিউএল কুকবুকের জন্য 40 ডলার বের করে দিয়েছি , এতে প্রচুর সমস্যার নিদর্শন রয়েছে, সহজ SELECT * FROM tableপ্রশ্নগুলি শুরু করে এবং একত্রিত হয়ে এবং একাধিক যোগদানের মধ্য দিয়ে।


হ্যাঁ, আমি কয়েক দিনের মধ্যে আমার ডেটা এসকিউএলে স্থানান্তরিত করতে শুরু করব, আপনাকে ধন্যবাদ! যদিও আমি এটি সমস্ত না করিয়ে ফেলা যায় ততক্ষণ স্ক্রিপ্টগুলি আমাকে অনেক সাহায্য করে আসছে!
তেরেসা ই জুনিয়র

1

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

grep -o '[0-9]\{12\}' file2 | sed 's/.*/^&$/' > /tmp/numpatterns.grep
grep -vf /tmp/numpatterns.grep file1 > file3
rm -f /tmp/numpatterns.grep

আপনি এটি ব্যবহার করতে পারেন:

sed -ne '/.*\([0-9]\{12\}.*/^\1$/p' file2 > /tmp/numpatterns.grep
grep -vf /tmp/numpatterns.grep file1 > file3
rm -f /tmp/numpatterns.grep

এগুলির প্রত্যেকটি একটি অস্থায়ী প্যাটার্ন ফাইল তৈরি করে যা বড় ফাইল ( file1) থেকে সংখ্যা সংগ্রহ করতে ব্যবহৃত হয় ।


আমি বিশ্বাস করি এটিরও বড় ফাইলগুলিতে এমন নম্বরগুলি পাওয়া যায় যা সেগুলি নয় not
কেভিন

ঠিক আছে, আমি 'দেখিনি!' ওপিতে শুধু grep -vfপরিবর্তে ব্যবহার করা প্রয়োজন grep -f
21:40

2
না @ আরসেজ, গ্রেপ-ভিএফ মেলে না কীগুলি প্রদর্শন করবে না, এটি নাম এবং কাজগুলি সহ সমস্ত কিছুই প্রদর্শন করবে।
টেরেসা ই জুনিয়র

1

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

grep -o '[0-9]\{12\}' keyfile | grep -v -f <(grep -o '^[0-9]\{12\}' bigfile) 

প্রথমটি grepচাবি পায়। তৃতীয়টি grep(এর মধ্যে <(...)) বড় ফাইলটিতে ব্যবহৃত সমস্ত কীগুলি <(...)নিয়ে -fযায় এবং দ্বিতীয় গ্রেপের ক্ষেত্রে এটি একটি ফাইলের মতো পাস করে file যার ফলে দ্বিতীয়টি grepম্যাচের জন্য লাইনগুলির তালিকা হিসাবে এটি ব্যবহার করে। এরপরে এটি পাইপ (প্রথম grep) থেকে তার ইনপুট (কীগুলির তালিকা) মেলানোর জন্য এটি ব্যবহার করে এবং কী ফাইল থেকে প্রাপ্ত কোনও কী মুদ্রণ করে এবং -vবড় ফাইলটি নয় ( )।

অবশ্যই আপনি অস্থায়ী ফাইলগুলির সাথে এটি করতে পারেন আপনার ট্র্যাক রাখতে হবে এবং মুছতে হবে মনে রাখতে হবে:

grep -o '[0-9]\{12\}'  keyfile >allkeys
grep -o '^[0-9]\{12\}' bigfile >usedkeys
grep -v -f usedkeys allkeys

এটি এতে allkeysউপস্থিত সমস্ত লাইনের মুদ্রণ করে usedkeys


দুর্ভাগ্যক্রমে এটি ধীর গতির এবং আমি 40 সেকেন্ড পরে একটি স্মৃতি ত্রুটি grep: Memory exhausted
পেয়েছি

@ পিটার.ও তবে এটি সঠিক। যাইহোক, সে কারণেই আমি কোনও ডাটাবেস বা commসেই ক্রমে প্রস্তাব দেব ।
কেভিন

হ্যাঁ এটি কাজ করে তবে লুপের চেয়ে অনেক ধীর।
তেরেসা ই জুনিয়র

1

কীফাইল বদলে যায় না? তারপরে আপনার বারবার পুরানো এন্ট্রিগুলি সন্ধান করা উচিত।

সঙ্গে tail -fআপনি একটি ক্রমবর্ধমান ফাইল আউটপুট পেতে পারেন।

tail -f growingfile | grep -f keyfile 

গ্রেপ -f একটি ফাইল থেকে নিদর্শনগুলি পড়ায়, নিদর্শন হিসাবে একটি লাইন।


এটি ভাল হবে তবে কী ফাইলটি সর্বদা আলাদা।
তেরেসা ই জুনিয়র

1

আমার উত্তর পোস্ট করতে যাচ্ছিল না কারণ আমি ভেবেছিলাম যে এত পরিমাণে ডেটা শেল স্ক্রিপ্টের মাধ্যমে প্রক্রিয়া করা উচিত নয় এবং একটি ডাটাবেস ব্যবহারের সঠিক উত্তর ইতিমধ্যে দেওয়া হয়েছিল। তবে এখন থেকে অন্য 7 টি পন্থা রয়েছে ...

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

declare -a record
while read key
do
    read name
    read job
    record[$key]="$name:$job"
done < file1

for number in $(grep -o '[0-9]\{12\}' file2)
do
    [[ -n ${mylist[$number]} ]] || echo $number >> file3
done

আমি যথেষ্ট স্মৃতি পেয়েছি, কিন্তু আমি এটিকে আরও ধীর বলে মনে করেছি। ধন্যবাদ যদিও!
তেরেসা ই জুনিয়র

1

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

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

% python -V
Python 2.7.2+

আমি sqlite3 লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটি একটি সরল ফাইল-ভিত্তিক সমাধান যা সমস্ত প্ল্যাটফর্মের জন্য বিদ্যমান (আপনার ওয়েব ব্রাউজারের অভ্যন্তরে!) এবং এটির জন্য কোনও সার্ভারের প্রয়োজন হয় না। মূলত শূন্য-কনফিগারেশন এবং শূন্য রক্ষণাবেক্ষণ।

নীচে একটি সাধারণ অজগর স্ক্রিপ্ট যা আপনার উদাহরণ হিসাবে দেওয়া ফাইল ফর্ম্যাটটিকে বিশ্লেষণ করবে এবং তারপরে একটি সাধারণ "সমস্ত নির্বাচন করুন" ক্যোরি করবে এবং এটি ডিবিতে সঞ্চিত সমস্ত কিছু আউটপুট করবে।

#!/usr/bin/env python

import sqlite3
import sys

dbname = '/tmp/simple.db'
filename = '/tmp/input.txt'
with sqlite3.connect(dbname) as conn:
    conn.execute('''create table if not exists people (key integer primary key, name text, job text)''')
    with open(filename) as f:
        for key in f:
            key = key.strip()
            name = f.next().strip()
            job = f.next().strip()
            try:
                conn.execute('''insert into people values (?,?,?)''', (key, name, job))
            except sqlite3.IntegrityError:
                sys.stderr.write('record already exists: %s, %s, %s\n' % (key, name, job))
    cur = conn.cursor()

    # get all people
    cur.execute('''select * from people''')
    for row in cur:
        print row

    # get just two specific people
    person_list = [1358726575123, 9973834728345]
    cur.execute('''select * from people where key in (?,?)''', person_list)
    for row in cur:
        print row

    # a more general way to get however many people are in the list
    person_list = [1358726575123, 9973834728345]
    template = ','.join(['?'] * len(person_list))
    cur.execute('''select * from people where key in (%s)''' % (template), person_list)
    for row in cur:
        print row

হ্যাঁ, এর অর্থ হ'ল আপনাকে কিছু এসকিউএল শিখতে হবে, তবে এটি দীর্ঘমেয়াদে উপযুক্ত হবে। এছাড়াও, আপনার লগ ফাইলগুলি বিশ্লেষণের পরিবর্তে, আপনি সরাসরি আপনার স্ক্লাইট ডাটাবেসে ডেটা লিখতে পারেন।


অজগর স্ক্রিপ্ট জন্য আপনাকে ধন্যবাদ! আমি মনে করি /usr/bin/sqlite3শেল স্ক্রিপ্টগুলির জন্য একইভাবে কাজ করে (প্যাকেজ.ডিবিয়ান.আর / স্পিজেস / এসকিলেট 3 ), যদিও আমি এটি কখনও ব্যবহার করি নি।
তেরেসা ই জুনিয়র

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