স্ট্রিংগুলি ভিতরে খারাপ পাঠ্য শৈলীর ভিতরে পাঠ্য চিহ্নিতকারী রাখছেন? বিকল্প আছে?


10

আমি প্রচুর স্ট্রিং নিয়ে কাজ করি যার জন্য অনেকগুলি হেরফের দরকার।

উদাহরণস্বরূপ, আমি এর মতো একটি স্ট্রিং তৈরি করতে পারি:

পার্ট 1
নৌকা

বিভাগ একটি
প্রোগ্রামিং

পার্ট 2
প্রোগ্রামিংয়ের জন্য পার্টিশনিং বোট।

বিভাগ এএ
বিভাগ এসকিউএল এন্ট্রি।

স্ট্রিংটি এর প্রতিটি অংশটি ম্যানুয়ালি পরীক্ষা করতে খুব বড় হবে। এখন আমি প্রয়োজন splitএই stringএকটি মধ্যে stringlistবিভাগ এবং অংশ দ্বারা। আমি দুটি বিকল্প সম্পর্কে ভাবতে পারি:

একটি নিয়মিত প্রকাশ:

QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));

দেখে মনে হচ্ছে এটি কাজ করা উচিত, তবে কখনও কখনও ব্যতিক্রমগুলি পিছলে যায় (আইই: Section SQL Entriesভুলভাবে বিভক্ত হয়ে যায়)

অন্যথায় আমি যখন প্রথম স্ট্রিং উত্পন্ন করতাম তখন আমি যা করতে পারতাম তা চিহ্নিতকারী স্থাপন করা হয়:

পার্ট 1
নৌকা

Ection সেকশন এ
প্রোগ্রামিং


প্রোগ্রামিংয়ের জন্য পার্ট 2 পার্টিশনিং বোট।

Ection
সেকশন এএ বিভাগ এসকিউএল এন্ট্রি।

যার অর্থ স্ট্রিং বিভক্ত করা সহজ হয়ে উঠবে:

QStringList sl = s.split("🚤💻"));

কিছু আমাকে বলছে যে এগুলির উভয়ই ভাল স্টাইল বা প্রোগ্রামিং অনুশীলন নয়, তবে এই পয়েন্টটি নিয়ে আলোচনা না করা বা বিকল্প খুঁজে না পাওয়া পর্যন্ত আমার কাছে উপস্থিত রয়েছে।

  • আপনি যদি আমার প্রকল্প পরিচালক হন, আপনি কি এই পদ্ধতিগুলির কোনওটি গ্রহণ করবেন?
  • যদি তা না হয় তবে আমি সেরা অনুশীলন হিসাবে কী করব?

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

আমি মনে করি না যে এমন কোনও চিহ্নিতকারী যা আপনার বর্তমান এনকোডিংয়ের মধ্যে ভাল অনুবাদ করে না তা একটি ভাল ধারণা।
টুলাইনস কর্ডোভা

2
ব্যবহৃত প্রকৃত প্রতীকগুলি বেশিরভাগ ক্ষেত্রে অপ্রাসঙ্গিক, কোনও পার্থক্য আনতে চলেছে তা আপনি যে জিনিসটি পার্স করতে চেষ্টা করছেন তার ব্যাকরণ
জে কে।

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

2
@ আকিভা একটি তালিকায় থাকা উপাদানগুলি পুনরুদ্ধার করা এবং প্রতিস্থাপন করা সবচেয়ে খারাপভাবে একটি বড় স্ট্রিং বিভক্ত করার সাথে তুলনীয় হওয়া উচিত ।
জ্যাকব রায়হলে

উত্তর:


17

নথির এনকোডিংটিকে স্ট্রিংয়ে পাঠ্য হিসাবে এম্বেড করা খারাপ অভ্যাস নয়। মার্কডাউন, এইচটিএমএল, এক্সএমএল, জেএসন, ওয়াইএএমএল, ল্যাটেক্স ইত্যাদি সম্পর্কে ভাবুন

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


আমার ক্ষেত্রে, আমি একটি চাকা আবিষ্কার করছি, আমি যা করার চেষ্টা করছি তা যদি একটি মার্কডাউন ভাষার জন্য একটি অনন্য দোভাষী তৈরি করা হয়। : উদাহরণস্বরূপ, আমার প্রকল্পের এক SSML মানুষের কান দ্বারা পাঠযোগ্য যেমন ক্ষীর ব্যাখ্যা ছিল meta.wikimedia.org/wiki/Grants:IdeaLab/... । << সেই URL এর শেষে একটি সময়সীমা রয়েছে, অন্যথায় এটি কাজ করবে না
আকিভা

2
@ আকিভা আমাকে আমার কর্মক্ষেত্রের দ্বারা বিকশিত একটি কাস্টম পাঠ্য বিন্যাসের সাথে কাজ করতে হবে যা আক্ষরিক অর্থে চাকাটিকে পুনর্বহাল করে। এর জন্য আমাকে 3 টি ভাষায় 4 টি পার্সার বজায় রাখতে হবে (জাভাস্ক্রিপ্ট, জাভা এবং উদ্দেশ্য-সি), এবং এটি একটি চমকপ্রদ দুঃস্বপ্নএখনই সঠিক কাজটি করুন এবং এই স্বনির্ধারিত পাঠ্য বিন্যাসটি বাজে কথা বাতিল করুন । আমি যথেষ্ট কিভাবে চাপ সৃষ্টি করতে পারেন বিশাল একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন এই রাস্তা নিচে কয়েক বছর হয়ে যাবে। বিদ্যমান কাঠামোগত বিন্যাসগুলি, এক্সএমএল,
জেএসওন

@ ক্রিসক্রাইফাইস আপনি কীভাবে এটি একটি দুঃস্বপ্নের একটি উদাহরণ দিতে পারেন?
আকিভা

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

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

8

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

এর সর্বাধিক গুরুত্বপূর্ণ অংশটি হ'ল প্রতিটি বিভাগ অক্ষত থাকে, যখন প্রতিটি "বিভাগ শিরোনাম" যথাযথভাবে চিহ্নিত করা দরকার।

কেন একটি সাধারণ বিভাজক ব্যবহার না করে পড়ার উপযোগী রাখবেন? কিছুটা এইরকম:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

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

প্রতিটি বিভাগে কোন পাঠ্যটি প্রত্যাশিত তা সম্পর্কে আরও জ্ঞান ছাড়াই এই ক্ষেত্রে সাধারণ বিভাজকটি কী সেরা হবে সে সম্পর্কে একটি সুপারিশ করা শক্ত ।


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

5

গৃহীত উত্তরটি মনে হয় আপনি একটি মন্তব্যে যা লিখেছেন তা মিস করেছে:

কারণটি হ'ল আমি যে ম্যানিপুলেশন করি তা প্রচুর স্ট্রিংয়ের প্রয়োজন

এবং এটি একটি উদাহরণ হিসাবে দিয়েছেন:

s.replace ("নৌকা", "প্রোগ্রামিং");

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

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

এখানে আরও ভাল ডিজাইনের বিকল্পটি হ'ল একটি বিমূর্ত ডেটাটাইপ সরবরাহ করা (যদি আপনি চান তবে একটি ক্লাস ব্যবহার করুন), এটিকে কল করতে দিন MyStringListএবং একটি ছোট সেট বেসিক ক্রিয়াকলাপ সরবরাহ করুন যা আপনাকে সেই অপারেশনের ক্ষেত্রে আপনার "হাজার হাজার ফাংশন" প্রয়োগ করতে দেয়। উদাহরণস্বরূপ, জেনেরিক findএবং replaceঅপারেশন বা জেনেরিক ফাংশনাল mapঅপারেশন হতে পারে । আপনি JoinToStringযদি কিছু নির্দিষ্ট পোশাকের জন্য একটি স্ট্রিংয়ে পুরো তালিকাটি সত্যই প্রয়োজন হয় তবে আপনি অপারেশনের মতো কিছু যুক্ত করতে পারেন ।

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


আপভোট করুন কারণ আমি আসলে এমন কিছু তৈরি করেছি। এটা আমার কাছে সেট কাস্টম বন্ধনী বলে দেয়, <এবং >, এবং এটি যে স্ট্রিং যেখানে আমি সহজে দৃষ্টান্ত আমি চাই না সরাতে পারেন, এবং পরিচ্ছন্নভাবে উপায় আমি চাই এটা নিপূণভাবে প্রতিটি উদাহরণের দখল করবে। এটি ভাল কারণ নিয়মিত প্রকাশগুলি এ জাতীয় সাবস্ট্রিংগুলি হ্যান্ডেল করে না: <boat <programming>>ভাল যেখানে বন্ধনীগুলির একাধিক স্তর রয়েছে।
আকিভা

1

বর্ণিত ফর্ম্যাটটি INI ফাইলগুলির সাথে খুব মিল:

https://en.wikipedia.org/wiki/INI_file

সেক্ষেত্রে বিভাগটি বর্গক্ষেত্র বন্ধনী দ্বারা আবদ্ধ থাকে [] সুতরাং আপনি যা বর্ণনা করছেন তা পাঠ্যের অতিরিক্ত অর্থ যুক্ত করতে কিছু ফ্যাশনে বিভাগটি চিহ্নিত করে অর্থবোধ করে।


0

উদাহরণস্বরূপ, আমি এর মতো একটি স্ট্রিং তৈরি করতে পারি:

প্রশ্ন: আপনি এই স্ট্রিংটি "উত্পন্ন" থেকে কী করেন?

চান যে কোনো নিপূণভাবে করা আরো সহজ হবে?


স্ট্রিং কোনও ওয়েবসাইট থেকে ডেটাস্ক্র্যাপিং ব্যবহারকারীর সামগ্রী থেকে উত্পন্ন হয়।
আকিভা

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

কখনও কখনও আমি কী ডেটা আমার কাছে মূল্যবান তা বাছাই করতে পাই না এবং তাই আপনি যা দেখছেন তার জন্য সর্বদা সততা যাচাই করা বা কেবল সাধারণ আপস করা এবং সর্বোত্তম হওয়ার জন্য আশা করা দরকার। উদাহরণস্বরূপ: আমি দোভাষীর LaTeXকাছে একটি লিখেছিলাম SSMLএবং এর মধ্যে একটি বিষয় হ'ল আপনি আলাদা আলাদা কোড সহ অভিন্ন চিত্র তৈরি করতে পারবেন এবং তাই ব্যবহারকারী তার সূত্রগুলি তৈরির জন্য দুর্বল বা রহস্যজনক উপায় বেছে নিলে সামঞ্জস্য হওয়া খুব নিকটেই সম্ভব। দিনের শেষে সমস্ত অর্থ হ'ল যে লোকেরা ভাল অনুশীলন ব্যবহার করে না তাদের স্ক্রিপ্টগুলির একটি শালীন ব্যাখ্যা থাকবে না।
আকিভা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.