একটি বিশাল টেক্সট ফাইলে একটি নির্দিষ্ট লাইনে কীভাবে ঝাঁপ পাবেন?


107

নীচের কোডের কোনও বিকল্প আছে:

startFromLine = 141978 # or whatever line I need to jump to

urlsfile = open(filename, "rb", 0)

linesCounter = 1

for line in urlsfile:
    if linesCounter > startFromLine:
        DoSomethingWithThisLine(line)

    linesCounter += 1

আমি যদি (~15MB)অজানা তবে ভিন্ন দৈর্ঘ্যের রেখাগুলি সহ একটি বিশাল পাঠ্য ফাইলটি প্রক্রিয়াকরণ করছি এবং একটি নির্দিষ্ট লাইনে ঝাঁপ দেওয়া দরকার যা আমি আগে থেকেই জানি? আমি এক এক করে তাদের প্রক্রিয়া করে খারাপ অনুভব করি যখন আমি জানি আমি কমপক্ষে প্রথমার্ধের ফাইলটিকে উপেক্ষা করতে পারি। যদি থাকে তবে আরও মার্জিত সমাধানের সন্ধান করছেন।


আপনি কীভাবে জানবেন যে ফাইলটির প্রথম 1/2 টি "\ n" এর একগুচ্ছ নয়, যখন দ্বিতীয়ার্ধটি একক লাইন? এ নিয়ে আপনার খারাপ লাগছে কেন?
অ্যান্ড্রু ডাল্কে

7
আমি মনে করি শিরোনামটি বিভ্রান্তিমূলক - tbh 15MB আসলে "বিশাল পাঠ্য ফাইল" নয়, কমপক্ষে বলতে ...
pms

উত্তর:


30

লিনিচেক :

linecacheমডিউল, অভ্যন্তরীণভাবে নিখুত করার চেষ্টা একটি ক্যাশে, সাধারণ ক্ষেত্রে যেখানে অনেক লাইন একটি একক ফাইল থেকে পড়া হয় ব্যবহার করার সময়, একটি পাইথন সোর্স ফাইল থেকে কোন লাইন পেতে এক পারেন। এটি tracebackমডিউল দ্বারা ফর্ম্যাট ট্রেসব্যাকের অন্তর্ভুক্তির জন্য উত্স লাইনগুলি পুনরুদ্ধার করতে ব্যবহৃত হয় ...


164
আমি কেবল এই মডিউলটির উত্স কোডটি যাচাই করেছি: পুরো ফাইলটি মেমোরিতে পড়ে! সুতরাং আমি কোনও উত্তরটিতে একটি ফাইলটিতে প্রদত্ত লাইনটি দ্রুত অ্যাক্সেস করার উদ্দেশ্যে এই উত্তরটি অবশ্যই স্পষ্টভাবে রুল করব।
MiniQuark

MiniQuark, আমি এটি চেষ্টা করেছিলাম, এটি আসলে কার্যকর হয় এবং সত্যিই দ্রুত। আমি একই সাথে এই মুহুর্তে কয়েক ডজন ফাইলে কাজ করলে কী হবে তা আমার দেখতে হবে, আমার সিস্টেমটি কখন মারা যায় তা সন্ধান করুন।
ব্যবহারকারী 63503

5
আপনার ওএসের ভার্চুয়াল মেমরি ম্যানেজারটি বেশ খানিকটা সাহায্য করে, তাই যদি আপনি প্রচুর পৃষ্ঠা ত্রুটি তৈরি না করেন তবে মেমোরিতে বড় ফাইলগুলি পড়া ধীর হতে পারে না: বিপরীতে, এটি "বোকা উপায়" করে এবং প্রচুর এবং প্রচুর বরাদ্দ করা হয় স্মৃতি স্মরণে দ্রুত হতে পারে। আমি এতে ডেনিশ ফ্রিবিএসডি বিকাশকারী পল-হেনিং কাম্পের নিবন্ধটি উপভোগ করেছি: queue.acm.org/detail.cfm?id=1814327
মর্টেন জেনসেন

13
100 জি ফাইল চেষ্টা করে দেখুন, এটি সফল হয়। আমি f.tell ব্যবহার করতে হবে (), f.seek (), f.readline ()
whi

114

লাইন বিরতি কোথায় তা আপনি জানেন না বলে আপনি কমপক্ষে একবার ফাইলটিতে না পড়লে এগিয়ে যেতে পারবেন না। আপনি যেমন কিছু করতে পারেন:

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])

2
+1, তবে সাবধান হন যে তিনি যদি বেশ কয়েকটি এলোমেলো লাইনে ঝাঁপিয়ে পড়েন তবেই এটি কার্যকর useful তবে যদি সে কেবল একটি লাইনে ঝাঁপিয়ে পড়ে, তবে এটি অপব্যয়ী
হ্যাসেন

3
+1: এছাড়াও, যদি ফাইলটি পরিবর্তন না হয় তবে লাইন নম্বর সূচকটি পিকেল এবং পুনঃব্যবহার করা যেতে পারে, আরও ফাইল স্ক্যান করার প্রাথমিক ব্যয়কে আরও বাড়তি।
এস .লট

ঠিক আছে, আমি সেখানে লাফ দেওয়ার পরে আমি কীভাবে এই অবস্থান থেকে শুরু করে লাইন বাই লাইন প্রক্রিয়া করব?
ব্যবহারকারীর 63503

8
একটি বিষয় লক্ষণীয় (বিশেষ করে উইন্ডোজে): বাইনারি মোডে ফাইলটি খুলতে সাবধান হন, অথবা বিকল্পভাবে অফসেট = ফাইল.টেল () ব্যবহার করুন। উইন্ডোজটিতে পাঠ্য মোডে, লাইনটি ডিস্কের কাঁচা দৈর্ঘ্যের তুলনায় একটি বাইট ছোট হবে (\ r \ n দ্বারা প্রতিস্থাপন \ n)
ব্রায়ান

2
@ ফটোগ্রাফার: রিড () বা রিডলাইন () ব্যবহার করুন, তারা বর্তমান অবস্থান থেকে শুরু করে সন্ধান অনুসারে সেট করুন।
এস .লট

22

লাইনগুলি যদি বিভিন্ন দৈর্ঘ্যের হয় তবে আপনার সত্যিকারের অনেকগুলি বিকল্প নেই ... আপনি পরের লাইনে কখন অগ্রগতি করেছেন তা জানতে দুঃখের সাথে লাইন সমাপ্ত অক্ষরগুলি প্রক্রিয়া করা প্রয়োজন।

আপনি যাইহোক, নাটকীয়ভাবে এটির গতি বাড়িয়ে দিতে পারেন এবং শেষ পরামিতিটি 0 টি নয় এমন কিছুতে "ওপেন করুন" পরিবর্তন করে মেমরির ব্যবহার হ্রাস করতে পারেন।

0 এর অর্থ ফাইল রিডিং অপারেশনটি আনফার্ড নয় যা খুব ধীর এবং ডিস্ক নিবিড়। 1 এর অর্থ ফাইলটি লাইন বাফারড, যা উন্নতি হবে। 1 এর উপরে যে কোনও কিছু (8k বলুন .. যেমন: 8096 বা তার চেয়ে বেশি) ফাইলের খণ্ডগুলি মেমোরিতে পড়ে reads আপনি এখনও এটি অ্যাক্সেস করতে পারেন for line in open(etc):তবে অজগরটি একবারে কিছুটা যায়, প্রতিটি বার্ফার অংশটিকে প্রক্রিয়াজাতকরণের পরে তাড়িয়ে দেয়।


6
8 কে 8192, নিরাপদ দিকে থাকতে 8 << 10 লিখতে সম্ভবত আরও ভাল better :)
বিনোদন

আপনি কি কোনও সুযোগে জানেন যে বাফারসাইজটি বাইটে নির্দিষ্ট করা হয়েছে? উপযুক্ত বিন্যাস কি? আমি কি '8 কে' লিখতে পারি? নাকি এটি '8096' হওয়া উচিত?
ব্যবহারকারী 63503

1
হাহাহা ... অবশ্যই শুক্রবার হতে হবে ... আমি স্পষ্টভাবে গণিত করতে পারি না। বাফার আকারটি সত্যই বাইট প্রকাশের একটি পূর্ণসংখ্যা, সুতরাং
819 এর

আমার আনন্দ - আশা করি এটি কার্যকর হয়েছে। একটি আধুনিক সিস্টেমে আপনি সম্ভবত বাফার আকারটি কিছুটা বাড়িয়ে তুলতে পারেন। 8 কে কোনও কারণে আমি সনাক্ত করতে পারি না বলে আমার স্মৃতিতে কেবল একটি হোল্ডওভার।
জারেট হার্ডি

আমি এখানে কিছু পরীক্ষা করেছি এবং এটি -১ এ সেট করেছি (ওস ডিফল্ট, প্রায়শই 8 কে, তবে প্রায়শই বলা শক্ত) এটি যত তাড়াতাড়ি পায় ততই দ্রুত বলে মনে হয়। এটি বলেছিল, এর একটি অংশ হতে পারে যে আমি ভার্চুয়াল সার্ভারে পরীক্ষা করছি।
অস্কার স্মিথ

12

আমি সম্ভবত প্রচুর পরিমাণে ভেড়া দ্বারা নষ্ট হয়েছি, তবে 15 এম বিশাল নয়। মেমরির সাথে পঠন readlines() হ'ল আমি সাধারণত এই আকারের ফাইলগুলিই করি। এর পরে কোনও লাইন অ্যাক্সেস করা তুচ্ছ।


আমি কেন পুরো ফাইলটি পড়তে কিছুটা দ্বিধাগ্রস্থ ছিলাম - আমার সেই প্রসেসগুলির বেশ কয়েকটি চলতে পারে এবং তাদের মধ্যে কয়েক ডজন যদি 12 টি ফাইল 15 এমবি পড়ে তবে এটি ভাল না হতে পারে। তবে এটি কাজ করবে কিনা তা জানতে আমার এটি পরীক্ষা করা দরকার। ধন্যবাদ.
ব্যবহারকারী 63503

4
এইচআরএম, এবং এটি যদি 1 জিবি ফাইল হয়?
নোয়া

@ ফটোগ্রাফার: এমনকি 15MB ফাইলগুলিতে "বেশ কয়েকটি" প্রক্রিয়াগুলি পড়ার জন্য একটি সাধারণ আধুনিক মেশিনের বিষয়টি বিবেচনা করা উচিত নয় (নির্ভর করে আপনি অবশ্যই তাদের সাথে কী করছেন)।
জ্যাকব গ্যাব্রিয়েলসন

জ্যাকব, হ্যাঁ, আমার চেষ্টা করা উচিত। ভার্চুয়াল মেশিনে ভিএম ক্র্যাশ না হলে প্রক্রিয়াটি (এস) চলছে / চলছে weeks দুর্ভাগ্যক্রমে গতবার এটি 6 দিন পরে ক্র্যাশ হয়েছিল। হঠাৎ যেখানেই থামল সেখান থেকে আমার চালিয়ে যাওয়া দরকার। এটি কোথায় রেখে গেছে তা কীভাবে খুঁজে বের করতে হবে তা এখনও খুঁজে বের করতে হবে।
ব্যবহারকারী 63503

@ নোয়া: তবে তা নয়! তুমি আর কেন যাচ্ছ না? 128TB ফাইল করলে কী হবে? অনেকগুলি ওএস এটি সমর্থন করতে সক্ষম হয় না। সমস্যা আসার সাথে সাথে কেন সমাধান করবেন না?
সাইলেন্টগোস্ট

7

আমি অবাক হয়েছি কেউ আইসিস উল্লেখ করেনি

line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line

অথবা আপনি যদি ফাইলটির পুরো অংশটি চান তা করতে পারেন

rest_of_file = itertools.islice(Fhandle,index_of_interest)
for line in rest_of_file:
    print line

অথবা আপনি যদি ফাইল থেকে অন্য লাইন চান

rest_of_file = itertools.islice(Fhandle,index_of_interest,None,2)
for odd_line in rest_of_file:
    print odd_line

5

যেহেতু সমস্ত রেখাগুলি না পড়ে সেগুলির দৈর্ঘ্য নির্ধারণ করার কোনও উপায় নেই, তাই আপনার প্রারম্ভিক লাইনের আগে সমস্ত রেখায় পুনরাবৃত্তি করা ছাড়া আপনার কোনও বিকল্প নেই। আপনি যা করতে পারেন তা হ'ল এটি সুন্দর দেখানো। ফাইলটি যদি সত্যিই বিশাল হয় তবে আপনি জেনারেটর ভিত্তিক পদ্ধতির ব্যবহার করতে চাইতে পারেন:

from itertools import dropwhile

def iterate_from_line(f, start_from_line):
    return (l for i, l in dropwhile(lambda x: x[0] < start_from_line, enumerate(f)))

for line in iterate_from_line(open(filename, "r", 0), 141978):
    DoSomethingWithThisLine(line)

দ্রষ্টব্য: সূচকটি এই পদ্ধতির ভিত্তিতে শূন্য।


4

আপনি যদি পুরো ফাইলটি মেমোরিতে পড়তে না চান তবে আপনার প্লেইন পাঠ্য বাদে অন্য কোনও ফর্ম্যাট নিয়ে আসতে হবে।

অবশ্যই এটি আপনি যা করার চেষ্টা করছেন তার উপর এবং কতবার আপনি ফাইলটি পেরে যাবেন তার উপর নির্ভর করে।

উদাহরণস্বরূপ, আপনি যদি একই ফাইলে অনেকবার লাইনে ঝাঁপিয়ে যাচ্ছেন , এবং আপনি জানেন যে এর সাথে কাজ করার সময় ফাইলটি পরিবর্তন হয় না, আপনি এটি করতে পারেন:
প্রথমে পুরো ফাইলটি পাস করুন এবং "রেকর্ড করুন" কিছু কী-লাইন-সংখ্যার (যেমন, কখনও 1000 লাইন)
সন্ধানের অবস্থান ", তারপরে আপনি যদি 12005 লাইন চান তবে 12000 (আপনি যে রেকর্ড করেছেন) অবস্থানে ঝাঁপিয়ে পড়ুন এবং তারপর আপনাকে জানবেন '12005 লাইনে আবারও রয়েছে


3

আপনি যদি ফাইলে অবস্থিত অবস্থানটি আগে থেকেই জানেন (পরিবর্তে লাইন নম্বর), আপনি সেই অবস্থানটিতে যেতে file.seek () ব্যবহার করতে পারেন ।

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


আমি অবশ্যই এই উদ্দেশ্যে লিনিচেক ব্যবহার করব না, কারণ এটি অনুরোধ করা লাইনটি ফেরার আগে মেমরির মধ্যে পুরো ফাইলটি পড়ে।
MiniQuark

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

3

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

  • আপনি কোন লাইন চান ?.
  • সূচী ফাইলে সংশ্লিষ্ট লাইন সংখ্যার অফসেট গণনা করুন (কারণ সূচী ফাইলের লাইন আকার স্থির) constant
  • সূচী ফাইল থেকে লাইন পেতে সরাসরি বাঁচতে চাইলে বা যা কিছু ব্যবহার করুন।
  • প্রকৃত ফাইলের সংশ্লিষ্ট লাইনের জন্য বাইট অফসেট পেতে পার্স করুন।

3

আমার একই সমস্যা হয়েছে (বিশাল ফাইল নির্দিষ্ট লাইন থেকে পুনরুদ্ধার করা প্রয়োজন)।

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

আমি পরবর্তী সিদ্ধান্তটি খুঁজে পেলাম: প্রথমত আমি প্রতিটি লাইনের শুরুর অবস্থানের সাথে অভিধানটি শেষ করেছি (কীটি লাইন নম্বর এবং মান - পূর্ববর্তী লাইনের সংক্ষিপ্ত দৈর্ঘ্য)।

t = open(file,’r’)
dict_pos = {}

kolvo = 0
length = 0
for each in t:
    dict_pos[kolvo] = length
    length = length+len(each)
    kolvo = kolvo+1

শেষ পর্যন্ত, লক্ষ্য ফাংশন:

def give_line(line_number):
    t.seek(dict_pos.get(line_number))
    line = t.readline()
    return line

t.seek (line_number) - কমান্ড যা লাইন ইনসেপশন পর্যন্ত ফাইলের ছাঁটাই চালায়। সুতরাং, আপনি যদি পরবর্তী পাঠ্যরেখা প্রতিশ্রুতিবদ্ধ হন - আপনি আপনার লক্ষ্য রেখাটি পান।

এই জাতীয় পদ্ধতির ব্যবহার করে আমি সময়ের উল্লেখযোগ্য অংশ সাশ্রয় করেছি।


3

আপনি লাইনগুলির অফসেটটি খুঁজে পেতে এমএমএপ ব্যবহার করতে পারেন। এমএম্যাপ ফাইলটি প্রক্রিয়া করার দ্রুততম উপায় বলে মনে হচ্ছে

উদাহরণ:

with open('input_file', "r+b") as f:
    mapped = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
    i = 1
    for line in iter(mapped.readline, ""):
        if i == Line_I_want_to_jump:
            offsets = mapped.tell()
        i+=1

তারপরে আপনার প্রয়োজনীয় লাইনে যাওয়ার জন্য f.seek (অফসেট) ব্যবহার করুন


2

লাইনগুলিতে কি কোনও সূচকের তথ্য থাকে? যদি প্রতিটি লাইনের বিষয়বস্তু " <line index>:Data" জাতীয় কিছু ছিল seek()তবে ফাইলটির মাধ্যমে বাইনারি অনুসন্ধান করতে পন্থাটি ব্যবহার করা যেতে পারে, এমনকি পরিমাণের পরিমাণ Dataপরিবর্তনশীল হলেও । আপনি ফাইলটির মধ্যবিন্দুতে সন্ধান করতে চাইবেন, একটি লাইন পড়ুন, পরীক্ষা করুন যে এটির সূচকটি আপনি চান তার চেয়ে বেশি বা কম, ইত্যাদি

অন্যথায়, আপনি সবচেয়ে ভাল করতে পারেন ন্যায়বিচার readlines()। আপনি যদি সমস্ত 15 এমবি পড়তে চান না, আপনি sizehintকমপক্ষে readline()কম সংখ্যক কল দিয়ে কমপক্ষে অনেকগুলি প্রতিস্থাপন করতে যুক্তিটি ব্যবহার করতে পারেন readlines()


2

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

import commands

def read_line(path, line=1):
    return commands.getoutput('head -%s %s | tail -1' % (line, path))

line_to_jump = 141978
read_line("path_to_large_text_file", line_to_jump)

অবশ্যই এটি উইন্ডোজ বা কিছু ধরণের লিনাক্স শেলের সাথে সামঞ্জস্যপূর্ণ নয় যা মাথা / লেজ সমর্থন করে না।
উইজম্যান

পাইথনে এটি করা কি দ্রুত?
শামুন

এটি কি একাধিক লাইন পেতে পারে?
শামুন

1

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

def getlineno(filename, lineno):
    if lineno < 1:
        raise TypeError("First line is line 1")
    f = open(filename)
    lines_read = 0
    while 1:
        lines = f.readlines(100000)
        if not lines:
            return None
        if lines_read + len(lines) >= lineno:
            return lines[lineno-lines_read-1]
        lines_read += len(lines)

print getlineno("nci_09425001_09450000.smi", 12000)

0

উত্তরগুলির কোনওটিই বিশেষভাবে সন্তোষজনক নয়, সুতরাং সাহায্যের জন্য এখানে একটি ছোট স্নিপেট।

class LineSeekableFile:
    def __init__(self, seekable):
        self.fin = seekable
        self.line_map = list() # Map from line index -> file position.
        self.line_map.append(0)
        while seekable.readline():
            self.line_map.append(seekable.tell())

    def __getitem__(self, index):
        # NOTE: This assumes that you're not reading the file sequentially.  
        # For that, just use 'for line in file'.
        self.fin.seek(self.line_map[index])
        return self.fin.readline()

ব্যবহারের উদাহরণ:

In: !cat /tmp/test.txt

Out:
Line zero.
Line one!

Line three.
End of file, line four.

In:
with open("/tmp/test.txt", 'rt') as fin:
    seeker = LineSeekableFile(fin)    
    print(seeker[1])
Out:
Line one!

এর মধ্যে অনেকগুলি ফাইল সন্ধান করা জড়িত তবে আপনি যে ফাইলগুলিকে মেমরির সাথে পুরোটা ফিট করতে পারবেন না সে ক্ষেত্রে এটি কার্যকর। লাইন অবস্থানগুলি পেতে এটি প্রাথমিক পাঠ করে (সুতরাং এটি পুরো ফাইলটি পড়ে, তবে এটি সমস্ত স্মৃতিতে রাখে না) এবং তারপরে প্রতিটি অ্যাক্সেস একটি ফাইল সত্যের সন্ধান করে।

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


-1

এই ফাংশনটি লাইন এন ফিরে আসতে ব্যবহার করতে পারেন:

def skipton(infile, n):
    with open(infile,'r') as fi:
        for i in range(n-1):
            fi.next()
        return fi.next()

অবিচ্ছিন্ন ফাঁকা লাইন থাকলে এই যুক্তিটি কাজ করে না, fi.next () সমস্ত খালি লাইন একবারে এড়িয়ে যায়, অন্যথায় এটি ভাল :)
আনভেশ ইয়ালামার্থি

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