2017-07-07 8 views
0

大規模なCSVファイルが多数あるウェブサイトがあります(最大10万行まで)。各CSVファイルから、ファイルの最後の行を読み取る必要があります。私はその内容を読む前に、ディスク上のファイルを保存するときの問題を解決する方法を知っている:ディスクにファイルを保存せずにウェブサイトの最終行を読む

   var url = "http://data.cocorahs.org/cocorahs/export/exportreports.aspx?ReportType=Daily&Format=csv&Date=1/1/2000&Station=UT-UT-24" 
      var client = new System.Net.WebClient(); 
      var tempFile = System.IO.Path.GetTempFileName(); 
      client.DownloadFile(url, tempFile); 
      var lastLine = System.IO.File.ReadLines(tempFile).Last(); 

は、ディスク上の一時ファイルを保存せずに、最後の行を取得する方法はありますか? 私が試した:

using (var stream = client.OpenRead(seriesUrl)) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 
     var lastLine = reader.ReadLines("file.txt").Last(); 
    } 
} 
が、StreamReaderクラスはReadLinesメソッドを持っていないサービスは(のみCSVのヘッダ)データを返しませんでしたが...

+1

コンテンツの最後の部分だけが必要な場合は、[HTTP Range headers](https://stackoverflow.com/questions/1434647/)を実装する必要があります。 –

答えて

2

StreamReaderにはReadLinesメソッドがありませんが、ストリームから次の行を読み取るにはReadLine methodがあります。あなたは、このようなリモートリソースからの最後の行を読み取るためにそれを使用することができます:

using (var stream = client.OpenRead(seriesUrl)) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 
     string lastLine; 

     while ((lastLine = reader.ReadLine()) != null) 
     { 
      // Do nothing... 
     } 

     // lastLine now contains the very last line from reader 
    } 
} 

一度に一つのラインを読むReadLinestringとしてメモリに全体の流れを読んであろう、StreamReader.ReadToEndに比べて少ないメモリを使用します。 。 100,000行のCSVファイルの場合、これはかなりのメモリ量になります。

1

これは、私の仕事:

public void TestMethod1() 
{ 
    var url = "http://data.cocorahs.org/cocorahs/export/exportreports.aspx?ReportType=Daily&Format=csv&Date=1/1/2000&Station=UT-UT-24"; 
    var client = new System.Net.WebClient(); 

    using (var stream = client.OpenRead(url)) 
    { 
     using (var reader = new StreamReader(stream)) 
     { 
      var str = reader.ReadToEnd().Split('\n').Where(x => !string.IsNullOrEmpty(x)).LastOrDefault(); 

      Debug.WriteLine(str); 
      Assert.IsNotEmpty(str); 
     } 
    } 

} 
関連する問題