2012-02-11 7 views
0

\nのパフォーマンススピードに焦点を当てて、約30行のファイルの最後または2行を読み込む方法はありますか?新しいIO.FileStream()オブジェクトを作成した場合のC#Cのファイルの最後の行を読むには

+0

ため、ほとんど重複して検索することを確認していない:[どのように、読み・テキスト・ファイル・逆-付きイテレータ・イン・C-シャープ?] (http://stackoverflow.com/questions/452902/how-to-read-a-text-file-reverse-with-iterator-in-c-sharp?) – nawfal

答えて

3

を使用して

string[] splitedArray= input.Split('\n'); 
string lastLine = splitedArray[splitedArray.Length-1]; 

は、ユーザーが指定できるようになります.Seek()方法があります:

EDIT:より速く 何かあなたが探したい場所の一部としてのファイルの終わり。しかし、この時点で最後の行がどこから始まるかを直接的に確認する方法はありません。あなたは後方に向かって行を探して歩くか、この最後の行がどのように見えるか(そしてどれくらい長くなっているか)を知っていれば、どれくらいの距離を必要とするかを推測することができます追求してもう少し進んでください。 FileStream.CanSeekプロパティを使用して、現在のインスタンスがシークをサポートしているかどうかを判断します。詳細については、Stream.CanSeekを参照してください。

FileStream fileStream = new FileStream(fileName, FileMode.Open) 
// Set the stream position to the end of the file. 
fileStream.Seek(0, SeekOrigin.End); 

あなたが/ N

を得るまで、あなたはまた、この他の質問で読むことができますループでオーバー行く:場合は私の頭の上からHow to read a text file reversely with iterator in C#

+0

最後から文字列を読み取る方法はありますか? –

+0

私は自分の答えを編集しました。私の答えではパフォーマンスが最適化されていることに注意してください。ファイル全体を読む必要はありません! –

11

string lastline = input.Substring(
    input.LastIndexOf('\n')); 
+1

'string lastline = input.Substring(input.LastIndexOf( '\ n'))'ここで十分でしょう。 –

+0

@Lester私の頭と私の答えを更新しました;-) – rene

+1

あなたの答えでは、パフォーマンスは最悪です。すべての文字列を文字列に読み込む必要があります。これは必要ありません。 –

1

任意のファイルを読むときにより良いパフォーマンスが必要です。メモリマップファイルの読み書きが可能です。これは、低レベルのAPIで動作することです。

0

(注:これはC#ではなくVB.NETです)私は数時間前にa function that I created for Pythonを翻訳しました。 \n唯一最良の選択です...

Public Function tail(ByVal filepath As String) As String 
    ' @author marco sulla ([email protected]) 
    ' @date may 31, 2016 

    Dim fp As String = filepath 
    Dim res As String 

    Using f As FileStream = File.Open(fp, FileMode.Open, FileAccess.Read) 
     Dim f_info As New FileInfo(fp) 
     Dim size As Long = f_info.Length 
     Dim start_pos As Long = size - 1 

     If start_pos < 0 Then 
      start_pos = 0 
     End If 

     If start_pos <> 0 Then 
      f.Seek(start_pos, SeekOrigin.Begin) 
      Dim mychar As Integer = f.ReadByte() 

      If mychar = 10 Then ' newline 
       start_pos -= 1 
       f.Seek(start_pos, SeekOrigin.Begin) 
      End If 

      If start_pos = 0 Then 
       f.Seek(start_pos, SeekOrigin.Begin) 
      Else 
       mychar = -1 

       For pos As Long = start_pos To 0 Step -1 
        f.Seek(pos, SeekOrigin.Begin) 

        mychar = f.ReadByte() 

        If mychar = 10 Then 
         Exit For 
        End If 
       Next 
      End If 
     End If 

     Using r As StreamReader = New StreamReader(f, Encoding.UTF8) 
      res = r.ReadLine() 
     End Using 
    End Using 

    Return res 
End Function 
関連する問題