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

C# 使用asp.net反转tsv/csv文件或仅读取最后一行,c#,asp.net,file,file-handling,C#,Asp.net,File,File Handling,我最近几天遇到了一个问题。我有一个位于远程服务器上的文件,可以使用用户ID和密码进行访问。嗯,访问没有问题 问题是我有大约150个。每个都是可变大小的,最小值为2MB,最大值为3MB 我必须一个接一个地读取它们,并从中读取最后一行/行数据。我正在用我当前的代码做这件事 主要的问题是它需要花费太多的时间,因为它从上到下读取文件 public bool TEst(string ControlId, string FileName, long offset) {

我最近几天遇到了一个问题。我有一个位于远程服务器上的文件,可以使用用户ID和密码进行访问。嗯,访问没有问题

问题是我有大约150个。每个都是可变大小的,最小值为2MB,最大值为3MB

我必须一个接一个地读取它们,并从中读取最后一行/行数据。我正在用我当前的代码做这件事

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

       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();
  }

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


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

示例要求远程ftp服务器的所有者为每个文件创建一个[filename]\u lastrow文件,其中包含文件的最后一行。然后,您的程序将对[filename]\u lastrow文件进行操作。你可能会惊喜地得到一个通融的回答“好的,我们可以为你做”


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

您也可以并行下载所有文件,并在文件完成后将其弹出队列进行解析,而不是同步执行此过程。如果ftp服务器可以处理更多的连接,请根据场景使用尽可能多的连接。解析也可以并行完成

更多阅读:


这有点隐晦,但我在你最初的回答中加了一条评论。您可以从中提取一些很棒的代码。

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


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

,而不是使用StreamReader自己处理响应流。我承认我从来没有试图寻找一个响应流,但已经阅读过,所以它看起来是可能的?你能建议我在这个。文件正在每45秒更新一次。我已经要求过了。仍然不走运。ftp比interweb更古老。它只是不支持seek。3.4 gbits的固定数据会阻塞我的家庭办公室连接。只是一个想法:一些ftp服务器具有简历下载功能,您是否尝试利用简历功能伪造“搜索”,然后获取最后的“x”kb数据?您的解决方案是良好的+1,但在远程服务器上更新文件中的内容时,它会增加其大小。因此,我无法修复偏移量。我非常确定您可以列出每个文件大小的文件夹内容。我可以,但为此,我必须编写两种方法,一种是获取文件大小,另一种是基于文件大小设置偏移量。我在线程中使用了您的方法,但无法控制写入内容。它正在引发找不到文件的异常。有关线程代码,请参见我的编辑。我在函数中使用了线程。这个主意很好。它提高了性能。但数据并没有出现在输出中。我的意思是,我不能用它来设置控制。知道吗?事情会比这复杂得多。您将无法从后台线程写入主UI线程。Async/await可能是实现这一点的最简单方法,但根据并发性,您需要在后台下载/处理数据,并将数据返回到主aspx页面。线程是另一种蠕虫。可能最简单的方法是在后台用最后几行代码创建自己的文件,就像其他人建议你的提供商为你做的那样。通过并行下载FTP创建文件。刷新您的页面以检查一些标志,表明事情已经完成,以及何时在主UI线程上使用新的主文件。每隔2秒刷新一次,您的用户甚至会得到更新:)您可能是对的。但从文件中获取数据的时间一直在消耗。线程正在产生问题,因为它给出了“文件未找到”错误。一个接一个地读也一样。建议我现在能做什么?我已经做了…现在我被困在使用线程从FTP访问多个文件的过程中。请查看我的更新代码了解详细信息。将您的问题更改为新方向???您更新的代码不完整,您调用测试通过3个参数,测试只需要两个参数。如果第三个参数是文件的偏移量,请记住,这必须是每个文件的偏移量。正如我在回答中所写,您可以为最后一行偏移量上传第二个文件(即file1.tsv文件1.llo)。这样,您将首先读取file1.llo,然后从file1.llo中定义的偏移量开始读取file1.tsv。这不会对线程的使用方式造成任何问题。James,这似乎是部分更新。我不知道如何保持每个文件的偏移量(本地或ftp上的补充文件)。除此之外,多线程还存在问题吗?