使用asp.net反转tsv / csv文件或仅读取最后一行

时间:2013-09-18 15:06:44

标签: c# asp.net file file-handling

嘿伙计们,过去几天我几乎都遇到了问题。我有一个位于远程服务器上的文件,可以使用userId和密码进行访问。好,访问没问题。

问题是我有大约150个。并且它们每个都是可变大小,最小为2 MB,最大为3 MB。

我必须逐个阅读它们并从中读取最后一行/行数据。我正在使用我当前的代码。

主要问题是它从上到下读取文件需要花费太多时间。

       public bool TEst(string ControlId, string FileName, long offset)
    {
        // The serverUri parameter should use the ftp:// scheme. 
        // It identifies the server file that is to be downloaded 
        // Example: ftp://contoso.com/someFile.txt. 

        // The fileName parameter identifies the local file. 
        //The serverUri parameter identifies the remote file. 
        // The offset parameter specifies where in the server file to start reading data. 
        Uri serverUri;
        String ftpserver = "ftp://xxx.xxx.xx.xxx/"+FileName;
        serverUri = new Uri(ftpserver);


        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            return false;
        }
        // Get the object used to communicate with the server.
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
        request.Credentials = new NetworkCredential("test", "test");

        request.Method = WebRequestMethods.Ftp.DownloadFile;

        //request.Method = WebRequestMethods.Ftp.DownloadFile;

        request.ContentOffset = offset;
        FtpWebResponse response = null;
        try
        {
            response = (FtpWebResponse)request.GetResponse();
           // long Size = response.ContentLength;

        }
        catch (WebException e)
        {
            Console.WriteLine(e.Status);
            Console.WriteLine(e.Message);
            return false;
        }


        // Get the data stream from the response.
        Stream newFile = response.GetResponseStream();
        // Use a StreamReader to simplify reading the response data.
        StreamReader reader = new StreamReader(newFile);
        string newFileData = reader.ReadToEnd();
        // Append the response data to the local file 
        // using a StreamWriter.


        string[] parser = newFileData.Split('\t');

        string strID = parser[parser.Length - 5];
        string strName = parser[parser.Length - 3];
        string strStatus = parser[parser.Length-1];

        if (strStatus.Trim().ToLower() != "suspect")
        {
            HtmlTableCell control = (HtmlTableCell)this.FindControl(ControlId);
            control.InnerHtml = strName.Split('.')[0];
        }
        else
        {
            HtmlTableCell control = (HtmlTableCell)this.FindControl(ControlId);
            control.InnerHtml = "S";
        }


        // Display the status description. 

        // Cleanup.

        reader.Close();
        response.Close();
        //Console.WriteLine("Download restart - status: {0}", response.StatusDescription);
        return true;
    }

线程:

  protected void Page_Load(object sender, EventArgs e)
  {


     new Task(()=>this.TEst("controlid1", "file1.tsv", 261454)).Start();
     new Task(()=>this.TEst1("controlid2", "file2.tsv", 261454)).Start();
  }

4 个答案:

答案 0 :(得分:2)

FTP无法搜索文件只读取最后几行。 Reference: FTP Commands您必须与远程ftp服务器的开发人员和所有者协调,并要求他们制作包含您所需数据的附加文件。

示例请求远程ftp服务器的所有者为每个文件创建包含文件最后一行的[filename] _lastrow文件。然后,您的程序将在[filename] _lastrow文件上运行。您可能会对“我们可以为您做到这一点”的适应性答案感到惊喜

如果无法更改ftp服务器请求数据库连接。

答案 1 :(得分:1)

您还可以并行下载所有文件,并开始将它们弹出到队列中,以便在完成后进行解析,而不是同步执行此过程。如果ftp服务器可以处理更多连接,请使用尽可能多的方案。解析也可以并行完成。

更多阅读:System.Threading.Tasks

有点埋没,但我在你的原始答案中发表评论。 This SO question导致this blog post,其中包含一些您可以从中抽取的精彩代码。

答案 2 :(得分:0)

您可以使用Seek直接跳到Stream的末尾,而不是您的while循环。然后,您希望通过流向后工作,直到找到第一个新行变量。这篇文章应该为您提供您需要知道的一切。

Get last 10 lines of very large text file > 10GB

答案 3 :(得分:0)

FtpWebRequest 包含 ContentOffset 属性。查找/选择保持最后一行偏移的方法(本地或远程 - 即通过将4字节文件上传到ftp)。这是最快的方式,也是最适合网络流量的方式。

有关 FtpWebRequest 的更多信息,请访问 MSDN