.NET에서 줄 바꿈으로 문자열을 분할하는 가장 쉬운 방법은 무엇입니까?
.NET에서 문자열을 줄 바꿈으로 분할해야하며 문자열을 분할하는 유일한 방법은 Split 메서드를 사용하는 것입니다. 그러나 그것은 내가 (쉽게) 줄 바꿈으로 나누는 것을 허용하지 않을 것입니다. 그래서 그것을하는 가장 좋은 방법은 무엇입니까?
문자열로 분할하려면 문자열 배열을 사용하는 오버로드를 사용해야합니다.
string[] lines = theText.Split(
new[] { Environment.NewLine },
StringSplitOptions.None
);
편집 :
텍스트에서 다른 유형의 줄 바꿈을 처리하려면 둘 이상의 문자열을 일치시키는 기능을 사용할 수 있습니다. 이렇게하면 두 가지 유형의 줄 바꿈에서 올바르게 분할되고 텍스트에서 빈 줄과 간격이 유지됩니다.
string[] lines = theText.Split(
new[] { "\r\n", "\r", "\n" },
StringSplitOptions.None
);
사용은 StringReader
어떻습니까?
using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
string line = reader.ReadLine();
}
다음과 같이 문자열을 매우 쉽게 분할 할 수 있어야합니다.
aString.Split(Environment.NewLine.ToCharArray());
일반적인 솔루션으로 string.Split을 사용하지 않도록하십시오. 원래 문자열과 분할 복사본 모두 메모리에서 함수를 사용하는 모든 곳에서 더 많은 메모리를 사용하기 때문입니다. 확장을 시작할 때 이것이 큰 문제가 될 수 있다는 것을 믿으십시오. 100MB 문서를 처리하는 32 비트 일괄 처리 앱을 실행하면 8 개의 동시 스레드에서 엉망이 될 것입니다. 내가 전에 거기에 가본 것은 아닙니다 ...
대신 다음과 같은 반복자를 사용하십시오.
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();
Guffa의 답변에 따라 확장 클래스에서 다음을 사용하십시오.
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)
이것은 사용자 환경의 줄 끝 정의를 사용합니다. Windows에서 줄 끝은 CR-LF (캐리지 리턴, 줄 바꿈) 또는 C #의 이스케이프 문자 \r\n
입니다.
This is a reliable solution, because if you recombine the lines with String.Join
, this equals your original string:
var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);
What not to do:
- Use
StringSplitOptions.RemoveEmptyEntries
, because this will break markup such as Markdown where empty lines have syntactic purpose. - Split on separator
new char[]{Environment.NewLine}
, because on Windows this will create one empty string element for each new line.
Regex is also an option:
private string[] SplitStringByLineFeed(string inpString)
{
string[] locResult = Regex.Split(inpString, "[\r\n]+");
return locResult;
}
I just thought I would add my two-bits, because the other solutions on this question do not fall into the reusable code classification and are not convenient.
The following block of code extends the string
object so that it is available as a natural method when working with strings.
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);
}
}
}
You can now use the .Split()
function from any string as follows:
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);
To split on a newline character, simply pass "\n"
or "\r\n"
as the delimiter parameter.
Comment: It would be nice if Microsoft implemented this overload.
I'm currently using this function (based on other answers) in VB.NET:
Private Shared Function SplitLines(text As String) As String()
Return text.Split({Environment.NewLine, vbCrLf, vbLf}, StringSplitOptions.None)
End Function
It tries to split on the platform-local newline first, and then falls back to each possible newline.
I've only needed this inside one class so far. If that changes, I will probably make this Public
and move it to a utility class, and maybe even make it an extension method.
Here's how to join the lines back up, for good measure:
Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String
Return String.Join(Environment.NewLine, lines)
End Function
Well, actually split should do:
//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);
The RemoveEmptyStrings option will make sure you don't have empty entries due to \n following a \r
(Edit to reflect comments:) Note that it will also discard genuine empty lines in the text. This is usually what I want but it might not be your requirement.
I did not know about Environment.Newline, but I guess this is a very good solution.
My try would have been:
string str = "Test Me\r\nTest Me\nTest Me";
var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();
The additional .Trim removes any \r or \n that might be still present (e. g. when on windows but splitting a string with os x newline characters). Probably not the fastest method though.
EDIT:
As the comments correctly pointed out, this also removes any whitespace at the start of the line or before the new line feed. If you need to preserve that whitespace, use one of the other options.
Silly answer: write to a temporary file so you can use the venerable 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);
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);
}
}
}
Very easy, actually.
VB.NET:
Private Function SplitOnNewLine(input as String) As String
Return input.Split(Environment.NewLine)
End Function
C#:
string splitOnNewLine(string input)
{
return input.split(environment.newline);
}
참고URL : https://stackoverflow.com/questions/1547476/easiest-way-to-split-a-string-on-newlines-in-net
'Program Tip' 카테고리의 다른 글
Facebook 및 새 Twitter URL의 shebang / hashbang (#!)은 무엇입니까? (0) | 2020.09.29 |
---|---|
왜 px 대신 em? (0) | 2020.09.29 |
유닉스 타임 스탬프 문자열을 읽을 수있는 날짜로 변환 (0) | 2020.09.29 |
특수 달러 기호 쉘 변수는 무엇입니까? (0) | 2020.09.29 |
상대 경로에서 모듈 가져 오기 (0) | 2020.09.29 |