লাইন দ্বারা লাইন প্রক্রিয়াকরণের জন্য বাফারে প্রতিটি লাইন পড়ার একটি অদ্ভুত উপায় আছে?


11

পাইথনে আমি একটি ফাইল লাইন লাইন প্রক্রিয়াকরণের জন্য নিম্নলিখিতগুলি করতাম:

with open(infile) as f:
    for line in f:
        process(line)

কীভাবে এলিস্পে (ফাইলগুলির পরিবর্তে বাফার সহ) এটি করতে হয় তা দেখার চেষ্টা করে আমি কোনও সুস্পষ্ট উপায় পাইনি।

(আমি যা শেষ করতে চাই তা হল দুটি রেখার অর্ডারযুক্ত ডেটাস্ট্রাকচার, একটি হ'ল একটি রেজেক্সের সাথে মিলিত সমস্ত রেখার সাথে, অন্যটি মিলেনি those

উত্তর:


23

এটি করার বিভিন্ন উপায় রয়েছে। দক্ষতার পথটিকে আরও দক্ষ করে তোলা যায়, এর সাথে:

(goto-char (point-min))
(while (not (eobp))
  (let ((line (buffer-substring (point)
                                (progn (forward-line 1) (point)))))
    ...))

তবে ইমাক্সে স্ট্রিং না করে বাফারে কাজ করার প্রথাটি অনেক বেশি। সুতরাং স্ট্রিংটি বের করার চেয়ে এবং তারপরে এটির থেকে কাজ করার পরিবর্তে আপনি ঠিক করবেন:

(goto-char (point-min))
(while (not (eobp))
  ...
  (forward-line 1))

এছাড়াও, আপনি যদি পুরো বাফারের পরিবর্তে কোনও অঞ্চলে পরিচালনা করতে চান এবং যদি আপনার "অপারেট" এর মধ্যে বাফারটি সংশোধন করা হয় তবে এটি পিছন দিকে ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন না ঘুরতে হবে "প্রতিবার আপনি যখন বাফারটি সংশোধন করবেন তখন আপনার অঞ্চলের অবস্থান সরে যায়):

(goto-char end)
(while (> (point) start)
  ...
  (forward-line -1))

এই অপটিমাইজেশন টিপস জন্য ধন্যবাদ! আপনার কাছ থেকে শেখা সর্বদা ভাল।
দক্ষ মোদী

গত স্নিপেট সম্পর্কে, এই ভাবে হওয়া উচিত: (let ((start (point))) (goto-char (point-max)) (while (> (point) start) ... (forward-line -1)))?
कौशल মোদী

না, শেষ স্নিপেটটি কেবল এটি ধরে নিয়েছে startএবং endবিদ্যমান ভেরিয়েবলগুলি রয়েছে যা আমরা সেই অঞ্চলটি সীমিত করে যার উপরে আমরা পরিচালনা করতে চাই।
স্টিফান

6

আমি কোনও অহঙ্কারী উপায় জানি না তবে আমি এটি নিয়ে এসেছি:

(defun my/walk-line-by-line ()
  "Process each line in the buffer one by one."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (not (eobp))
      (let* ((lb (line-beginning-position))
             (le (line-end-position))
             (ln (buffer-substring-no-properties lb le)))
        (message ">> %s" ln) ; Replace this with any processing function you like
        (forward-line 1)))))

1

আমি মনে করি যে নীচেরগুলি এটি পেতে পারে ঠিক তেমন মূ id়:

(dolist (line (split-string (buffer-string) "\n")) 
  ... process line here ...
  )

সম্পাদনা: এখানে স্থিতির সাথে আরও একটি সমাধান রয়েছে loopএবং dolistএটি আপনার নিয়মিত অভিব্যক্তির সাথে মিলছে কি না সে অনুযায়ী লাইনগুলিও শ্রেণিবদ্ধ করে:

(loop for line in (split-string (buffer-string) "\n")
  if (string-match "your-regexp" line)
    collect line into matching
  else
    collect line into nonmatching
  finally return (cons matching nonmatching)
  )

আপনি যদি এই ফাংশনটির আউটপুটে একটি পরিবর্তনশীল সেট করে থাকেন (setq x (loop ...))তবে বলুন , তারপরে মিলের রেখাগুলির পছন্দসই তালিকাটি পাওয়া যাবে (car x), সাথে ননম্যাচিং লাইনের তালিকা থাকবে (cdr x)

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