문제
는 쉬운 방법이 있을 프로그래밍 방식으로 결정하는 라인의 수를 텍스트 파일 내?
해결책
진지하게 뒤늦은 편집 : .NET 4.0 이상을 사용하는 경우
그만큼 File
수업에는 새로운 것이 있습니다 ReadLines
욕심 적으로 선을 열거하는 방법은 모든 것을 배열과 같은 배열로 읽는 것이 아니라 선을 열거합니다. ReadAllLines
. 이제 다음과 같은 효율성과 간결함을 모두 가질 수 있습니다.
var lineCount = File.ReadLines(@"C:\file.txt").Count();
원래 답변
효율성에 대해 너무 귀찮게하지 않으면 간단히 쓸 수 있습니다.
var lineCount = File.ReadAllLines(@"C:\file.txt").Length;
보다 효율적인 방법을 위해 다음을 수행 할 수 있습니다.
var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
}
편집 : 효율성에 대한 질문에 대한 응답으로
내가 두 번째가 더 효율적이라고 말한 이유는 메모리 사용에 관한 것이 아니라 반드시 속도는 아닙니다. 첫 번째는 파일의 전체 내용을 배열에로드하므로 파일 크기만큼 메모리를 적어도 할당해야합니다. 두 번째는 단지 한 번에 한 줄 씩 반복되므로 한 번에 한 줄 이상의 메모리를 할당 할 필요가 없습니다. 작은 파일에는 중요하지는 않지만 큰 파일의 경우 문제가 될 수 있습니다 (예 : 단순히 충분하지 않은 경우 32 비트 시스템에서 4GB 파일에서 줄 수를 찾으려고하는 경우. 사용자 모드 주소 공간이 큰 배열을 할당하기위한 공간).
속도 측면에서 나는 그 안에 많은 것이있을 것으로 기대하지 않을 것입니다. Readalllines에는 일부 내부 최적화가있을 수 있지만 반면에 거대한 메모리 덩어리를 할당해야 할 수도 있습니다. 작은 파일의 경우 Readalllines가 더 빠르지 만 큰 파일의 경우 상당히 느리게 될 수 있다고 생각합니다. 말할 수있는 유일한 방법은 스톱워치 또는 코드 프로파일 러로 측정하는 것입니다.
다른 팁
제일 쉬운:
int lines = File.ReadAllLines("myfile").Length;
이것은 메모리를 적게 사용하지만 아마도 더 오래 걸릴 것입니다.
int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
count++;
}
reader.Close();
쉽게 해독하기 쉽지만 비효율적 인 기회 당 코드 줄을 의미합니까?
string[] lines = System.IO.File.RealAllLines($filename);
int cnt = lines.Count();
그것은 아마도 얼마나 많은 줄을 아는 가장 빠른 방법 일 것입니다.
당신은 또한 할 수 있습니다 (버퍼링하는 경우에 따라)
#for large files
while (...reads into buffer){
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine);
}
다른 많은 방법이 있지만 위의 중 하나는 아마도 당신이 갈 것입니다.
신속하게 읽고 카운터를 증가시킬 수 있습니다. 루프를 사용하여 텍스트로 아무것도하지 않고 증가하십시오.
수 캐리지 리턴/라인에 공급한다.내가 믿는 유니코드 그들은 여전히 0x000D 및 0x000A 각각합니다.할 수 있습니다 그런 식으로 효율적으로 또는 비효율적으로 원하는 결정이 있는 경우를 모두 처리자 또는 아
실행 가능한 옵션과 개인적으로 사용한 옵션은 파일의 첫 번째 줄에 자신의 헤더를 추가하는 것입니다. 나는 내 게임에 대한 사용자 정의 모델 형식을 위해 이것을했다. 기본적으로 .OBJ 파일을 최적화하고 필요없는 쓰레기를 제거하고 더 나은 레이아웃으로 변환 한 다음 총 라인 수, 얼굴, 정상, 정상 및 질감 UV를 작성하는 도구가 있습니다. 첫 번째 줄. 그런 다음 해당 데이터는 모델이로드 될 때 다양한 어레이 버퍼로 사용됩니다.
파일을 한 번만로드하여 한 번만로드하여 한 번만로드하고 다시 생성 된 버퍼에 데이터를 읽을 필요가 있기 때문에 유용합니다.
파일 자체를 읽는 데 시간이 걸리면, 신약 문자를 계산하기 위해 전체 파일을 읽을 때 쓰레기는 또 다른 문제입니다.
어느 시점에서, 누군가는 프레임 워크이든 코드인지 여부에 관계없이 파일의 문자를 읽어야합니다. 즉, 파일이 크면 메모리를 수집해야하므로 파일을 열고 메모리로 읽어야한다는 것을 의미합니다.
다음은 한 번에 4 자 씩 읽을 때 제안 된 솔루션이 있습니다. 라인 피드 문자를 계산하고 다음 문자 비교를 위해 동일한 메모리 주소를 다시 재사용합니다.
private const char CR = '\r';
private const char LF = '\n';
private const char NULL = (char)0;
public static long CountLinesMaybe(Stream stream)
{
Ensure.NotNull(stream, nameof(stream));
var lineCount = 0L;
var byteBuffer = new byte[1024 * 1024];
const int BytesAtTheTime = 4;
var detectedEOL = NULL;
var currentChar = NULL;
int bytesRead;
while ((bytesRead = stream.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
var i = 0;
for (; i <= bytesRead - BytesAtTheTime; i += BytesAtTheTime)
{
currentChar = (char)byteBuffer[i];
if (detectedEOL != NULL)
{
if (currentChar == detectedEOL) { lineCount++; }
currentChar = (char)byteBuffer[i + 1];
if (currentChar == detectedEOL) { lineCount++; }
currentChar = (char)byteBuffer[i + 2];
if (currentChar == detectedEOL) { lineCount++; }
currentChar = (char)byteBuffer[i + 3];
if (currentChar == detectedEOL) { lineCount++; }
}
else
{
if (currentChar == LF || currentChar == CR)
{
detectedEOL = currentChar;
lineCount++;
}
i -= BytesAtTheTime - 1;
}
}
for (; i < bytesRead; i++)
{
currentChar = (char)byteBuffer[i];
if (detectedEOL != NULL)
{
if (currentChar == detectedEOL) { lineCount++; }
}
else
{
if (currentChar == LF || currentChar == CR)
{
detectedEOL = currentChar;
lineCount++;
}
}
}
}
if (currentChar != LF && currentChar != CR && currentChar != NULL)
{
lineCount++;
}
return lineCount;
}
위의 줄은 라인 피드를보기 위해 모든 문자를 읽어야하므로 기본 프레임 워크에 의해 한 번에 한 문자를 읽는 것을 볼 수 있습니다.
Bay Nima를 수행 한대로 프로필을 프로파일하면 이것이 다소 빠르고 효율적인 방법이라는 것을 알 수 있습니다.
try {
string path = args[0];
FileStream fh = new FileStream(path, FileMode.Open, FileAccess.Read);
int i;
string s = "";
while ((i = fh.ReadByte()) != -1)
s = s + (char)i;
//its for reading number of paragraphs
int count = 0;
for (int j = 0; j < s.Length - 1; j++) {
if (s.Substring(j, 1) == "\n")
count++;
}
Console.WriteLine("The total searches were :" + count);
fh.Close();
} catch(Exception ex) {
Console.WriteLine(ex.Message);
}