[C#] 문자열을 줄로 나누는 가장 좋은 방법

여러 줄로 된 줄을 어떻게 줄로 나눕니 까?

나도 알아

var result = input.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

조금 못 생겼고 빈 줄을 잃습니다. 더 나은 해결책이 있습니까?



답변

  • 보기 흉한 경우 불필요한 ToCharArray통화를 제거하십시오 .

  • \n또는 로 나누려면 \r두 가지 옵션이 있습니다.

    • 배열 리터럴을 사용하십시오. 그러나 이것은 Windows 스타일 줄 끝을위한 빈 줄을 제공합니다 \r\n.

      var result = text.Split(new [] { '\r', '\n' });
    • Bart가 나타내는 정규식을 사용하십시오.

      var result = Regex.Split(text, "\r\n|\r|\n");
  • 빈 줄을 유지하려면 왜 C #에 명시 적으로 버리라고 지시합니까? ( StringSplitOptionsparameter) – StringSplitOptions.None대신 사용하십시오.


답변

using (StringReader sr = new StringReader(text)) {
    string line;
    while ((line = sr.ReadLine()) != null) {
        // do something
    }
}


답변

업데이트 : 대체 / 비동기 솔루션 은 여기 를 참조 하십시오 .


이것은 훌륭하게 작동하며 Regex보다 빠릅니다.

input.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None)

"\r\n"한 줄 바꿈으로 사용되도록 배열에서 첫 번째 를 갖는 것이 중요합니다 . 위의 Regex 솔루션 중 하나와 동일한 결과를 제공합니다.

Regex.Split(input, "\r\n|\r|\n")

Regex.Split(input, "\r?\n|\r")

Regex가 약 10 배 느리다는 것을 제외하고. 내 테스트는 다음과 같습니다.

Action<Action> measure = (Action func) => {
    var start = DateTime.Now;
    for (int i = 0; i < 100000; i++) {
        func();
    }
    var duration = DateTime.Now - start;
    Console.WriteLine(duration);
};

var input = "";
for (int i = 0; i < 100; i++)
{
    input += "1 \r2\r\n3\n4\n\r5 \r\n\r\n 6\r7\r 8\r\n";
}

measure(() =>
    input.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None)
);

measure(() =>
    Regex.Split(input, "\r\n|\r|\n")
);

measure(() =>
    Regex.Split(input, "\r?\n|\r")
);

산출:

00 : 00 : 03.8527616

00 : 00 : 31.8017726

00 : 00 : 32.5557128

확장 방법은 다음 과 같습니다 .

public static class StringExtensionMethods
{
    public static IEnumerable<string> GetLines(this string str, bool removeEmptyLines = false)
    {
        return str.Split(new[] { "\r\n", "\r", "\n" },
            removeEmptyLines ? StringSplitOptions.RemoveEmptyEntries : StringSplitOptions.None);
    }
}

용법:

input.GetLines()      // keeps empty lines

input.GetLines(true)  // removes empty lines


답변

Regex.Split을 사용할 수 있습니다.

string[] tokens = Regex.Split(input, @"\r?\n|\r");

편집 : |\r(이전) Mac 라인 터미네이터를 설명하기 위해 추가되었습니다 .


답변

빈 줄을 유지하려면 StringSplitOptions를 제거하십시오.

var result = input.Split(System.Environment.NewLine.ToCharArray());


답변

나는이 있었다 다른 대답 잭의 기반으로하지만,이 한 대답을 , 훨씬 빠르게되고 는 비동기 적으로 작동하기 때문에 비록 약간 느린 선호 될 수 있습니다.

public static class StringExtensionMethods
{
    public static IEnumerable<string> GetLines(this string str, bool removeEmptyLines = false)
    {
        using (var sr = new StringReader(str))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                if (removeEmptyLines && String.IsNullOrWhiteSpace(line))
                {
                    continue;
                }
                yield return line;
            }
        }
    }
}

용법:

input.GetLines()      // keeps empty lines

input.GetLines(true)  // removes empty lines

테스트:

Action<Action> measure = (Action func) =>
{
    var start = DateTime.Now;
    for (int i = 0; i < 100000; i++)
    {
        func();
    }
    var duration = DateTime.Now - start;
    Console.WriteLine(duration);
};

var input = "";
for (int i = 0; i < 100; i++)
{
    input += "1 \r2\r\n3\n4\n\r5 \r\n\r\n 6\r7\r 8\r\n";
}

measure(() =>
    input.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None)
);

measure(() =>
    input.GetLines()
);

measure(() =>
    input.GetLines().ToList()
);

산출:

00 : 00 : 03.9603894

00 : 00 : 00.0029996

00 : 00 : 04.8221971


답변

string[] lines = input.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);