문제

는 쉬운 방법이 있을 프로그래밍 방식으로 결정하는 라인의 수를 텍스트 파일 내?

도움이 되었습니까?

해결책

진지하게 뒤늦은 편집 : .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를 작성하는 도구가 있습니다. 첫 번째 줄. 그런 다음 해당 데이터는 모델이로드 될 때 다양한 어레이 버퍼로 사용됩니다.

파일을 한 번만로드하여 한 번만로드하여 한 번만로드하고 다시 생성 된 버퍼에 데이터를 읽을 필요가 있기 때문에 유용합니다.

파일 자체를 읽는 데 시간이 걸리면, 신약 문자를 계산하기 위해 전체 파일을 읽을 때 쓰레기는 또 다른 문제입니다.

어느 시점에서, 누군가는 프레임 워크이든 코드인지 여부에 관계없이 파일의 문자를 읽어야합니다. 즉, 파일이 크면 메모리를 수집해야하므로 파일을 열고 메모리로 읽어야한다는 것을 의미합니다.

Nima Ara는 고려할 수있는 좋은 분석을했습니다.

다음은 한 번에 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);
}         

당신은 "시작할 수 있습니다"화장실.Exe "실행 파일 (함께 제공됩니다 Unixutils 설치가 필요하지 않습니다.) 외부 프로세스로 실행됩니다. Unix vs Mac 대 Windows와 같은 다른 라인 수 메소드를 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top