c# - .NET में न्यूलाइन पर स्ट्रिंग को विभाजित करने का सबसे आसान तरीका?




string split (10)

आपको अपनी स्ट्रिंग को आसानी से विभाजित करने में सक्षम होना चाहिए, जैसे:

aString.Split(Environment.NewLine.ToCharArray());

मुझे एक स्ट्रिंग को .NET में न्यूलाइन में विभाजित करने की आवश्यकता है और स्ट्रिंग विधि के साथ स्ट्रिंग्स को विभाजित करने का एकमात्र तरीका है। हालांकि यह मुझे एक नई लाइन पर (आसानी से) विभाजित करने की अनुमति नहीं देगा, तो ऐसा करने का सबसे अच्छा तरीका क्या है?


एक स्ट्रिंग चर के लिए:

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 उपयोग करें, क्योंकि यह StringSplitOptions.RemoveEmptyEntries जैसे मार्कअप को तोड़ देगा जहां खाली लाइनों में वाक्य रचनात्मक उद्देश्य है।
  • विभाजक new char[]{Environment.NewLine} पर विभाजित करें, क्योंकि विंडोज़ पर यह प्रत्येक नई लाइन के लिए एक खाली स्ट्रिंग तत्व बनाएगा।

गुफा के उत्तर के आधार पर, एक विस्तार वर्ग में, उपयोग करें:

public static string[] Lines(this string source) {
    return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}

बस सोचा कि मैं अपने दो-बिट जोड़ दूंगा क्योंकि इस प्रश्न पर अन्य समाधान पुन: प्रयोज्य कोड वर्गीकरण में नहीं आते हैं और सुविधाजनक नहीं हैं। कोड का निम्न ब्लॉक 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() फ़ंक्शन का उपयोग .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" को डिलीमीटर पैरामीटर के रूप में पास करें।

टिप्पणी: यह अच्छा होगा अगर माइक्रोसॉफ्ट ने इस अधिभार को लागू किया।


मूर्ख जवाब: एक अस्थायी फ़ाइल को लिखें ताकि आप आदरणीय फ़ाइल का उपयोग कर सकें। 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);

मैं वर्तमान में 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

वास्तव में बहुत आसान है।

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

स्ट्रिंग का उपयोग करने से बचने का प्रयास करें। सामान्य समाधान के लिए स्प्लिट करें, क्योंकि आप हर जगह मेमोरी में फंक्शन - मूल स्ट्रिंग, और स्प्लिट कॉपी का उपयोग करते हुए अधिक मेमोरी का उपयोग करेंगे। मेरा विश्वास करो कि जब आप स्केल करना शुरू करते हैं तो यह एक समस्या का नरक हो सकता है - एक 32-बिट बैच-प्रसंस्करण ऐप को 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();

StringReader का उपयोग करने के बारे में क्या?

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

// 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