2016-04-12 9 views
1

私はC#の付いたテキストファイルを読み込むしようとしています、それは次のようにフォーマットされます。C#の - 不規則な改行文字を含むファイルを読む

this is a line\r\n 
this is a line\r 
\r\n 
this is a line\r 
\r\n 
this is a line\r 
\r\n 
this is a line\r\n 
this is a line\r 
\r\n 
etc... 

私は

StreamReader.ReadLine() 
でファイルから各行を読んでいます

しかし、改行文字は保存されません。私は各行のバイト数を数えているので、どのような改行文字があるのか​​を知る/検出する必要があります。行文字\rで終わる場合、ラインはで構成さ

:たとえば((nr-of-bytes-in-line) + 2 bytes)バイト:行が\r\nで終わる場合((nr-of-bytes-in-line) + 1 byte)バイト(もちろんの符号化タイプに応じて)、線が構成されています。

EDIT:

私はイスラエル祭壇の回答に基づいてソリューションを、持っています。 BTW:Jon Skeetもお勧めします。 ReadLineのオーバーライドされたバージョンを実装しました。これにより、改行文字が追加されます。これは、オーバーライドされた関数のコードです:

public override String ReadLine() 
    { 
     StringBuilder sb = new StringBuilder(); 
     while (true) 
     { 
      int ch = Read(); 
      if (ch == -1) 
      { 
       break; 
      } 
      if (ch == '\r' || ch == '\n') 
      { 
       if (ch == '\r' && Peek() == '\n') 
       { 
        sb.Append('\r'); 
        sb.Append('\n'); 
        Read(); 
        break; 
       } 
       else if(ch == '\r' && Peek() == '\r') 
       { 
        sb.Append('\r'); 
        break; 
       } 
      } 
      sb.Append((char)ch); 
     } 
     if (sb.Length > 0) 
     { 
      return sb.ToString(); 
     } 
     return null; 
    } 
+3

私は、基本的に 'ReadLine()'を再実装する必要があると思います。 –

+0

ReadLineを使用してください。バイトカウントが必要な場合は、一度に1文字ずつ読む。 – jdweng

+0

いいえ、私はこのようにします: 'string line = sr.ReadLine(); int nrOfBytes = Encoding.GetByteCount(line); 'しかし、\ rや\ r \ nのいずれかの新しい行の文字があるかどうかを検出する必要があります。 'nrOfBytes + = Encoding.GetByteCount(UNKNOWN-NEW-LINE-CHAR);' – DrGrid

答えて

1

これはreadlineのは、.NETリソースに応じて実装されている方法である:

// Reads a line. A line is defined as a sequence of characters followed by 
     // a carriage return ('\r'), a line feed ('\n'), or a carriage return 
     // immediately followed by a line feed. The resulting string does not 
     // contain the terminating carriage return and/or line feed. The returned 
     // value is null if the end of the input stream has been reached. 
     // 
     public virtual String ReadLine() 
     { 
      StringBuilder sb = new StringBuilder(); 
      while (true) { 
       int ch = Read(); 
       if (ch == -1) break; 
       if (ch == '\r' || ch == '\n') 
       { 
        if (ch == '\r' && Peek() == '\n') Read(); 
        return sb.ToString(); 
       } 
       sb.Append((char)ch); 
      } 
      if (sb.Length > 0) return sb.ToString(); 
      return null; 
     } 

あなたが文ならば、あなたは次のように追加することができます見ることができます。

if (ch == '\r') 
{ 
    //add the amount of bytes wanted 
} 
if (ch == '\n') 
{ 
    //add the amount of bytes wanted 
} 

または何でも操作します。

+2

あるいは単に '\ r'と' \ n'を 'StringBuilder'に追加するように変更してください。 – juharr

+1

私はこれを試してみるつもりですが、自分のバージョンのReadLine(オーバーライド版)を実装する必要があります。 – DrGrid

+1

私はカスタムクラスでReadLineのオーバーライド版を実装していますが、うまくいくと思います。私は最善の方法は、行のバイト数を取得することですテストですが、これは私が探していた解決策です。 – DrGrid

関連する問題