2014-09-15 6 views
1

주어진 .txt 또는 .csv 플랫 파일의 EOL 문자를 식별하려고합니다. 플랫 파일에있는 첫 번째 데이터 행의 EOL 문자를 기반으로이 파일의 데이터를 적절히 처리하려고합니다 (SQL Server에서 대량로드를 사용하여 대량의 EOL을 전달해야합니다). 로드 명령). Readline()은 EOL을 자동으로 처리하므로 EOL 문자의 Readline() 문자열을 구문 분석 할 수 없습니다.C# 플랫 파일의 EOL 문자 확인

int EOLChar_CRLF = 0; 
int EOLChar_LF = 0; 
int EOLChar_CR = 0; 
int EOLChar_Hex = 0; 

string eol_line = file2.ReadLine(); 
MessageBox.Show(eol_line); 
EOLChar_CRLF = eol_line.IndexOf("\\r\\\n"); 
EOLChar_LF = eol_line.IndexOf("\\n"); 
EOLChar_CR = eol_line.IndexOf("\\r"); 
EOLChar_Hex = eol_line.IndexOf("\\0x0a"); 

MessageBox.Show("CRLF is line feed if " + EOLChar_CRLF.ToString() + " <> -1"); 
MessageBox.Show("LF is line feed if " + EOLChar_LF.ToString() + " <> -1"); 
MessageBox.Show("CR is line feed if " + EOLChar_CR.ToString() + " <> -1"); 
MessageBox.Show("0x0a is line feed if " + EOLChar_Hex.ToString() + " <> -1"); 

누군가가 StreamReader.ReadLine() 메서드 또는이 달성의 다른 방법을 사용하여 EOL를 결정하는 방법을 알고 있나요 : 아래의 코드는 내가 뭘하려고 오전의 예를 준다? 난 단지 첫 번째 행의 데이터를 읽고 EOL을 위해 파싱하기 때문에이 파일 중 일부는 2 천만 행 이상이기 때문입니다.

+0

행 종결자가 무엇인지 모르는 경우 어떻게 첫 번째 "행"을 결정할 수 있습니까? 나에게 닭고기와 달걀 같은 소리가 난다. –

+0

왜 줄 구분 기호가 무엇인지 (OR)주의하고 싶습니까? MSDN마다'\ r' 또는'\ n' 또는'both'가됩니다. 'ReadLine()'메쏘드가이를 처리 할 것입니다. – Rahul

+0

ReadLine()은 자동으로 종결자를 처리합니다. 즉, ReadLine이 작동하고 첫 번째 행을 제공 할 EOL 문자를 결정할 필요가 없습니다. 필자는 Bulk Insert 문에 매개 변수로 전달해야하기 때문에 ReadLine()이 표시하지 않는 EOL 문자가 필요합니다. –

답변

4

텍스트 파일의 줄 끝 규칙을 결정하는 일반적인 방법은 파일의 시작부터 충분한 크기의 버퍼에서 슬러핑하여 검사하는 것입니다. 물론 버퍼의 크기는 예상되는 줄 길이에 다소 의존적입니다. 합리적인 수의 행을 얻으려면 충분한 데이터를 확보해야합니다.

Windows (CR + LF), Unix/Linux/OS X (LF) 또는 구식 MacOS (CR) 이외의 다른 방법으로는 끝나지 않을 수 있습니다. 속도면에서 이와 같은 것을 이길 수는 없을 것입니다.

public enum EndOfLineStyle 
{ 
    Unknown = 0  , 
    CR  = 1  , 
    LF  = 2  , 
    CRLF = CR|LF , 
    Unix = LF , 
    MacOs = CR , 
    Windows = CRLF , 
} 

const int BUFFER_SIZE = 8192 ; 
public EndOfLineStyle DetermineEndOfLineStyle(string pathToFile) 
{ 
    int bufl = 0 ; 
    char[] buf = new char[BUFFER_SIZE] ; 

    using (StreamReader reader = File.OpenText(pathToFile)) 
    { 
    bufl = reader.ReadBlock(buf , 0 , buf.Length) ; 
    } 

    int crlfs = 0 ; 
    int crs = 0 ; 
    int lfs = 0 ; 

    for (int i = 0 ; i < bufl ;) 
    { 
    if  (buf[i] == '\r' && i < bufl-1 && buf[i+1] == '\n') { ++crlfs ; i+=2 ; } 
    else if (buf[i] == '\r'         ) { ++crs ; i+=1 ; } 
    else if (buf[i] == '\n')         { ++lfs ; i+=1 ; } 
    } 

    EndOfLineStyle style ; 
    if  (crlfs > crs && crlfs > lfs) style = EndOfLineStyle.Windows ; 
    else if (lfs > crlfs && lfs > crs) style = EndOfLineStyle.Unix ; 
    else if (crs > crlfs && crs > lfs) style = EndOfLineStyle.MacOs ; 
    else          style = EndOfLineStyle.Unknown ; 

    return style ; 
} 
+0

고마워, 니콜라스. 이것은 내가 찾고있는 것입니다 (부분적으로 파일을 읽고 EOL을 얻을 수있는 솔루션). –

+1

다음 코드는 EOL이 Windows, Unix 또는 Mac에 속하지 않는다고 말하면서 끝없이 반복되는 루프를 생성합니다. (buf [i] == 'r'&& i