여러 줄로 된 줄을 어떻게 줄로 나눕니 까?
나도 알아
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 #에 명시 적으로 버리라고 지시합니까? (
StringSplitOptions
parameter) –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);