নেট .NET এ আমাকে নতুন স্ট্রাইনে বিভক্ত করতে হবে এবং আমি স্প্রিট পদ্ধতিতে স্ট্রিংগুলি বিভক্ত করার একমাত্র উপায় । তবে এটি আমাকে একটি নতুন লাইনে (সহজেই) বিভক্ত হতে দেয় না, তবে এটি করার সর্বোত্তম উপায় কী?
নেট .NET এ আমাকে নতুন স্ট্রাইনে বিভক্ত করতে হবে এবং আমি স্প্রিট পদ্ধতিতে স্ট্রিংগুলি বিভক্ত করার একমাত্র উপায় । তবে এটি আমাকে একটি নতুন লাইনে (সহজেই) বিভক্ত হতে দেয় না, তবে এটি করার সর্বোত্তম উপায় কী?
উত্তর:
স্ট্রিনে বিভক্ত হওয়ার জন্য আপনাকে ওভারলোডটি ব্যবহার করতে হবে যা স্ট্রিংগুলির অ্যারে নেয়:
string[] lines = theText.Split(
new[] { Environment.NewLine },
StringSplitOptions.None
);
সম্পাদনা:
আপনি যদি কোনও পাঠ্যে বিভিন্ন ধরণের লাইন ব্রেকগুলি পরিচালনা করতে চান তবে আপনি একাধিক স্ট্রিংয়ের সাথে মিলের দক্ষতাটি ব্যবহার করতে পারেন। এটি উভয় প্রকারের লাইন বিরতিতে সঠিকভাবে বিভক্ত হবে এবং পাঠ্যে ফাঁকা লাইন এবং ব্যবধান সংরক্ষণ করবে:
string[] lines = theText.Split(
new[] { "\r\n", "\r", "\n" },
StringSplitOptions.None
);
Environment.NewLine
সম্পত্তিটিতে সিস্টেমের জন্য ডিফল্ট নতুন লাইন রয়েছে। উইন্ডোজ সিস্টেমের উদাহরণস্বরূপ এটি হবে "\r\n"
।
\n
একটি রেখে যাওয়ার পরে বিভক্ত হয় \r
, তারপরে লাইনগুলিকে একটি \r\n
মধ্যবর্তী ফাঁকা করে দেয়।
\r
ও \n
সংকলনের (অন্যদের মধ্যে) ও পালানোর সিকোয়েন্সগুলির একটি বিশেষ অর্থ রয়েছে। ভিবিতে সেগুলি পালানোর ক্রম নেই, সুতরাং সেখানে those ধ্রুবকগুলি পরিবর্তে ব্যবহৃত হয়।
একটি ব্যবহার সম্পর্কে কি StringReader
?
using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
string line = reader.ReadLine();
}
while
যা এই উত্তরে যুক্ত করা উচিত।
আপনার স্ট্রিংটি খুব সহজেই বিভক্ত করতে সক্ষম হওয়া উচিত, যেমন:
aString.Split(Environment.NewLine.ToCharArray());
স্ট্রিং ব্যবহার এড়াতে চেষ্টা করুন a সাধারণ সমাধানের জন্য বিভক্ত করুন, কারণ আপনি ফাংশনটি যে কোনও জায়গায় ব্যবহার করবেন - মূল স্ট্রিং এবং বিভক্ত অনুলিপি, উভয়ই মেমরিতে ব্যবহার করবেন। আমার বিশ্বাস করুন যে আপনি স্কেল করা শুরু করার পরে এটি সমস্যার একটি নরক হতে পারে - ৩২-বিট ব্যাচ-প্রসেসিং অ্যাপ্লিকেশনটি 100 এমবি নথি প্রক্রিয়াকরণ করুন এবং আপনি আটটি সামনের থ্রেডে বিভক্ত হবেন। আমি আগে সেখানে ছিলাম না ...
পরিবর্তে, এর মতো একটি পুনরাবৃত্তি ব্যবহার করুন;
public static IEnumerable<string> SplitToLines(this string input)
{
if (input == null)
{
yield break;
}
using (System.IO.StringReader reader = new System.IO.StringReader(input))
{
string line;
while( (line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
এটি আপনাকে আপনার ডেটা ঘিরে আরও বেশি মেমরির দক্ষ লুপ করার অনুমতি দেবে;
foreach(var line in document.SplitToLines())
{
// one line at a time...
}
অবশ্যই, আপনি যদি মেমরির মধ্যে এটি সব চান, আপনি এটি করতে পারেন;
var allTheLines = document.SplitToLines.ToArray();
blah.SplitToLines..
উদাহরণস্বরূপ করতে পারেন document.SplitToLines...
?
this
এটি আনুষ্ঠানিক পরামিতিগুলিকে এটিকে একটি এক্সটেনশন পদ্ধতি হিসাবে তৈরি করেছে।
গুফার উত্তরের ভিত্তিতে, একটি এক্সটেনশন ক্লাসে, ব্যবহার করুন:
public static string[] Lines(this string source) {
return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}
স্ট্রিং ভেরিয়েবলের জন্য s
:
s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)
এটি আপনার পরিবেশের লাইন শেষের সংজ্ঞা ব্যবহার করে। উইন্ডোজে লাইন এন্ডিংগুলি হ'ল সিআর-এলএফ (ক্যারেজ রিটার্ন, লাইন ফিড) বা সি # এর পালানোর অক্ষর \r\n
।
এটি একটি নির্ভরযোগ্য সমাধান, কারণ আপনি যদি লাইনগুলি পুনরায় সমন্বিত করেন তবে এটি String.Join
আপনার মূল স্ট্রিংয়ের সমান:
var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);
কী করবেন না:
StringSplitOptions.RemoveEmptyEntries
, কারণ এটি মার্কডাউন যেমন মার্কডাউন ভাঙ্গবে যেখানে খালি লাইনের সিন্ট্যাক্টিক উদ্দেশ্য রয়েছে।new char[]{Environment.NewLine}
, কারণ উইন্ডোজে এটি প্রতিটি নতুন লাইনের জন্য একটি ফাঁকা স্ট্রিং উপাদান তৈরি করবে।Regex এছাড়াও একটি বিকল্প:
private string[] SplitStringByLineFeed(string inpString)
{
string[] locResult = Regex.Split(inpString, "[\r\n]+");
return locResult;
}
"\r?\n"
।
আমি কেবল ভেবেছিলাম যে আমি আমার টু-বিট যুক্ত করব, কারণ এই প্রশ্নের অন্যান্য সমাধানগুলি পুনরায় ব্যবহারযোগ্য কোডের শ্রেণিবদ্ধকরণের মধ্যে পড়ে না এবং সুবিধাজনক নয়।
নিম্নলিখিত কোডের ব্লকটি string
অবজেক্টটিকে প্রসারিত করে যাতে স্ট্রিংগুলির সাথে কাজ করার সময় এটি প্রাকৃতিক পদ্ধতি হিসাবে উপলব্ধ।
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.ObjectModel;
namespace System
{
public static class StringExtensions
{
public static string[] Split(this string s, string delimiter, StringSplitOptions options = StringSplitOptions.None)
{
return s.Split(new string[] { delimiter }, options);
}
}
}
আপনি এখন যে .Split()
কোনও স্ট্রিং থেকে নীচের মতো ফাংশনটি ব্যবহার করতে পারেন :
string[] result;
// Pass a string, and the delimiter
result = string.Split("My simple string", " ");
// Split an existing string by delimiter only
string foo = "my - string - i - want - split";
result = foo.Split("-");
// You can even pass the split options parameter. When omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);
একটি নতুন লাইন চরিত্রে বিভক্ত করতে কেবল পাসিমেল "\n"
বা "\r\n"
ডেলিমিটার প্যারামিটার হিসাবে।
মন্তব্য: মাইক্রোসফ্ট যদি এই ওভারলোডটি প্রয়োগ করে তবে ভাল লাগবে।
Environment.Newline
হয় হয় হার্ড কোডিং \n
বা পছন্দ হয় \r\n
।
Environment.Newline
ক্রস প্ল্যাটফর্মের সামঞ্জস্যের জন্য, বর্তমান অপারেটিং সিস্টেমের চেয়ে বিভিন্ন লাইন টার্মিনেশন ব্যবহার করে ফাইলগুলির সাথে কাজ করার জন্য নয়। আরও তথ্যের জন্য এখানে দেখুন , তাই এটি বিকাশকারী কী কাজ করছে তার উপর নির্ভর করে। Environment.Newline
ওএসের মধ্যে লাইন রিটার্ন টাইপের কোনও ধারাবাহিকতা নেই তা নিশ্চিত করার ব্যবহার , যেখানে 'হার্ড-কোডিং' বিকাশকারীকে সম্পূর্ণ নিয়ন্ত্রণ দেয়।
.Newline
যাদু নয়, হুডের নীচে এটি ইউনিক্স বা উইন্ডোতে চলছে কিনা তা স্যুইচের উপর ভিত্তি করে কেবল উপরে দেওয়া স্ট্রিং is সবচেয়ে নিরাপদ বাজি, প্রথমে সমস্ত "\ r \ n" এর জন্য একটি স্ট্রিং প্রতিস্থাপন করা এবং তারপরে "\ n" এ বিভক্ত হওয়া। যেখানে .Newline
ব্যর্থতা ব্যবহার করা হয়, আপনি যখন অন্য প্রোগ্রামগুলির দ্বারা সংরক্ষিত ফাইলগুলির সাথে কাজ করছেন যা লাইন ব্রেকগুলির জন্য আলাদা পদ্ধতি ব্যবহার করে। আপনি যখন প্রতিবার পড়েন ফাইলটি সর্বদা আপনার বর্তমান ওএসের লাইন ব্রেকগুলি ব্যবহার করে তা আপনি যদি জানেন তবে এটি ভাল কাজ করে।
foo = foo.Replace("\r\n", "\n"); string[] result = foo.Split('\n');
। আমি কি সঠিকভাবে বুঝতে পারি যে এটি সমস্ত প্ল্যাটফর্মে কাজ করে?
আমি বর্তমানে VB.NET এ এই ফাংশনটি (অন্যান্য উত্তরের ভিত্তিতে) ব্যবহার করছি:
Private Shared Function SplitLines(text As String) As String()
Return text.Split({Environment.NewLine, vbCrLf, vbLf}, StringSplitOptions.None)
End Function
এটি প্রথমে প্ল্যাটফর্ম-স্থানীয় নতুন লাইনে বিভক্ত হওয়ার চেষ্টা করে এবং তারপরে প্রতিটি সম্ভাব্য নতুন লাইনে ফিরে যায়।
আমি এখন পর্যন্ত এক শ্রেণীর ভিতরে এটির প্রয়োজন ছিল needed যদি এটি পরিবর্তন হয় তবে আমি সম্ভবত এটি তৈরি করব Public
এবং এটি একটি ইউটিলিটি ক্লাসে স্থানান্তর করব এবং সম্ভবত এটি একটি এক্সটেনশন পদ্ধতিও তৈরি করব।
ভাল পরিমাপের জন্য কীভাবে লাইনগুলি ব্যাক আপ করা যায় তা এখানে রয়েছে:
Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String
Return String.Join(Environment.NewLine, lines)
End Function
"\r"
= রিটার্ন "\r\n"
= রিটার্ন + নতুন লাইন। (দয়া করে এই পোস্টটি এবং গৃহীত সমাধানটি এখানে
ভাল, আসলে বিভক্ত করা উচিত:
//Constructing string...
StringBuilder sb = new StringBuilder();
sb.AppendLine("first line");
sb.AppendLine("second line");
sb.AppendLine("third line");
string s = sb.ToString();
Console.WriteLine(s);
//Splitting multiline string into separate lines
string[] splitted = s.Split(new string[] {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
// Output (separate lines)
for( int i = 0; i < splitted.Count(); i++ )
{
Console.WriteLine("{0}: {1}", i, splitted[i]);
}
string[] lines = text.Split(
Environment.NewLine.ToCharArray(),
StringSplitOptions.RemoveEmptyStrings);
RemoveEmptyStrings বিকল্প নিশ্চিত করুন যে আপনি \ N কারণে খালি ভুক্তি একটি পান \ r নিম্নলিখিত হবে না করতে হবে
(মন্তব্যগুলি প্রতিবিম্বিত করতে সম্পাদনা করুন :) নোট করুন এটি পাঠ্যে আসল খালি লাইনগুলিও ফেলে দেবে। এটি সাধারণত আমি যা চাই তা কিন্তু এটি আপনার প্রয়োজন হতে পারে না।
আমি এনভায়রনমেন্ট.নিউলাইন সম্পর্কে জানতাম না, তবে আমার ধারণা এটি খুব ভাল সমাধান।
আমার চেষ্টা হত:
string str = "Test Me\r\nTest Me\nTest Me";
var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();
অতিরিক্ত .Trim এখনও উপস্থিত থাকতে পারে এমন কোনও \ r বা remove n সরিয়ে দেয় (যেমন উইন্ডোতে যখন থাকে তবে ওএস এক্স নিউলাইন অক্ষরের সাথে একটি স্ট্রিং বিভক্ত করা হয়)। সম্ভবত দ্রুততম পদ্ধতি না হলেও।
সম্পাদনা করুন:
মতামতগুলি সঠিকভাবে নির্দেশিত হিসাবে, এটি লাইনের শুরুতে বা নতুন লাইন ফিডের আগে যে কোনও সাদা স্থানকে সরিয়ে দেয়। আপনার যদি সেই সাদা স্থান সংরক্ষণের প্রয়োজন হয় তবে অন্য বিকল্পগুলির মধ্যে একটি ব্যবহার করুন।
নির্বোধ উত্তর: একটি অস্থায়ী ফাইলে লিখুন যাতে আপনি সম্মানজনক ব্যবহার করতে পারেন
File.ReadLines
var s = "Hello\r\nWorld";
var path = Path.GetTempFileName();
using (var writer = new StreamWriter(path))
{
writer.Write(s);
}
var lines = File.ReadLines(path);
var
, কারণ এটি ভেরিয়েবলের ধরণ নির্ধারণ করে না, সুতরাং আপনি কীভাবে সেই বস্তুটি ব্যবহার করবেন, বা সেই বস্তুটি কী উপস্থাপন করে তা আপনি বুঝতে পারবেন না। এছাড়াও, এটি লাইনগুলি লিখতে দেখায় এবং কোনও ফাইলের নামও নির্দিষ্ট করে না, তাই আমি সন্দেহ করি এটি কার্যকর হবে। তারপরে, পড়ার সময়, ফাইলটির পথটি আবার নির্দিষ্ট করা হয়নি। Assuming যে path
হয় C:\Temp\test.txt
, তাহলে আপনি থাকা উচিত string[] lines = File.ReadLines(path);
।
Path.GetTempFileName
msdn.microsoft.com/en-us/library/... এবং এটা বলে এটি একটি শূন্য-বাইট ফাইল & আয় "যে ফাইলের সম্পূর্ণ পাথ" তৈরি করে। আমি শপথ করতে পারি আমি এর আগে চেষ্টা করেছিলাম এবং এটি একটি ব্যতিক্রম দেয় কারণ এটি কোনও ফাইল খুঁজে পায় নি, তবে পরিবর্তে ফোল্ডারের অবস্থান ফিরে পেয়েছিল। আমি ব্যবহারের জন্য যুক্তিগুলি জানি var
, তবে আমি বলব এটি প্রস্তাবিত নয় কারণ এটি ভেরিয়েবল অবজেক্টটি কী তা প্রদর্শন করে না। এটি এটিকে বিস্মৃত করে।
খুব সহজ, আসলে।
VB.NET:
Private Function SplitOnNewLine(input as String) As String
Return input.Split(Environment.NewLine)
End Function
সি #:
string splitOnNewLine(string input)
{
return input.split(environment.newline);
}
Environment.NewLine
ঠিক ভিবি- র মতো।