c# .NET এর নতুন লাইনগুলিতে একটি স্ট্রিং বিভক্ত করার সবচেয়ে সহজ উপায়?




string split (12)

আমি .NET তে একটি স্ট্রিংকে নতুন লাইনগুলিতে বিভক্ত করতে এবং স্ট্রিপ্টটি বিভক্ত করার একমাত্র উপায় Split পদ্ধতির সাথে। তবে এটি আমাকে (সহজেই) একটি নতুন লাইনে বিভক্ত করার অনুমতি দেবে না, তাই এটি করার সর্বোত্তম উপায় কী?


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

পরিবর্তে, এই মত একটি থালা ব্যবহারকারীর ব্যবহার করুন;

    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();

string[] lines = text.Split(
  Environment.NewLine.ToCharArray(), 
  StringSplitOptions.RemoveEmptyStrings);

RemoveEmptyStrings বিকল্প \ n নিম্নলিখিত \ r এর কারণে খালি এন্ট্রি নেই তা নিশ্চিত করবে

(মন্তব্য প্রতিফলিত করতে সম্পাদনা করুন :) মনে রাখবেন যে এটি পাঠ্যতে প্রকৃত খালি লাইনগুলিও বাদ দেবে। এটি সাধারণত আমি চাই তবে এটি আপনার প্রয়োজন হতে পারে না।


খুব সহজ, আসলে।

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 সম্পর্কে জানতাম না, কিন্তু আমি এটি একটি খুব ভাল সমাধান অনুমান।

আমার চেষ্টা করা হয়েছে:

        string str = "Test Me\r\nTest Me\nTest Me";
        var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();

অতিরিক্ত। টিম যে কোনও \ r বা \ n যা এখনও উপস্থিত থাকতে পারে (যেমন উইন্ডোজগুলিতে যখন কিন্তু os x newline অক্ষর সহ একটি স্ট্রিং বিভক্ত করে)। সম্ভবত দ্রুততম পদ্ধতি যদিও না।

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

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


একটি স্ট্রিংতে বিভক্ত করার জন্য আপনাকে ওভারলোড ব্যবহার করতে হবে যা স্ট্রিংগুলির একটি অ্যারে নেয়:

string[] lines = theText.Split(
    new[] { Environment.NewLine },
    StringSplitOptions.None
);

সম্পাদনা:
আপনি যদি পাঠ্যতে বিভিন্ন ধরনের লাইন বিরতিগুলি পরিচালনা করতে চান তবে আপনি একাধিক স্ট্রিং মিলানোর ক্ষমতা ব্যবহার করতে পারেন। এটি সঠিকভাবে কোনও লাইন বিরতিতে বিভক্ত হবে এবং পাঠ্যতে খালি লাইন এবং ফাঁক সংরক্ষণ করবে:

string[] lines = theText.Split(
    new[] { "\r\n", "\r", "\n" },
    StringSplitOptions.None
);

আমি বর্তমানে এই ফাংশনটি ব্যবহার করছি (অন্যান্য উত্তরগুলির উপর ভিত্তি করে) VB.NET- এ:

Private Shared Function SplitLines(text As String) As String()
    Return text.Split({Environment.NewLine, vbCrLf, vbLf}, StringSplitOptions.None)
End Function

এটি প্রথমে প্ল্যাটফর্ম-স্থানীয় নতুন লাইনটিতে বিভক্ত করার চেষ্টা করে এবং তারপরে প্রতিটি সম্ভাব্য নতুন লাইনে ফিরে আসে।

আমি শুধুমাত্র এক শ্রেণীর ভিতরে এই প্রয়োজন। যদি এটি পরিবর্তিত হয় তবে আমি সম্ভবত এই Public এবং এটি একটি ইউটিলিটি ক্লাসে স্থানান্তরিত করব এবং এমনকি এটি একটি এক্সটেনশান পদ্ধতিও তৈরি করব।

ভাল পরিমাপের জন্য লাইনগুলির ব্যাক আপে যোগদান করুন:

Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String
    Return String.Join(Environment.NewLine, lines)
End Function

একটি StringReader ব্যবহার সম্পর্কে কি?

using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
    string line = reader.ReadLine();
}

শুধু চিন্তা করলাম আমি আমার দ্বি-বিট যুক্ত করব কারণ এই প্রশ্নের অন্যান্য সমাধান পুনঃব্যবহারযোগ্য কোড শ্রেণিবদ্ধকরণে পড়ে না এবং এটি সুবিধাজনক নয়। কোডের নিচের ব্লক 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 param. when omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);

একটি নতুন লাইনে বিভক্ত করার জন্য, কেবলমাত্র "\n" বা "\r\n" delimiter পরামিতি হিসাবে পাস করুন।

মন্তব্য: মাইক্রোসফ্ট এই overload প্রয়োগ করা হলে এটি চমৎকার হবে।


নিরীহ উত্তর: একটি অস্থায়ী ফাইল লিখুন যাতে আপনি File.ReadLines ফাইল। 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);

ভাল, আসলে বিভক্ত করা উচিত:

//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]);
}

Regex এছাড়াও একটি বিকল্প:

    private string[] SplitStringByLineFeed(string inpString)
    {
        string[] locResult = Regex.Split(inpString, "[\r\n]+");
        return locResult;
    }

// using System.IO;

string textToSplit;

  if(textToSplit!=null)
   {
    List<string> lines = new List<string>();
    using (StringReader reader = new StringReader(textToSplit))
    {
        for (string line = reader.ReadLine(); line != null;line = reader.ReadLine())
        {
            lines.Add(line);
        }
    }
   }




split