getstr88 发表于 2022-6-19 23:29

C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大

C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大,单个6GB左右,如果正常File.ReadAllText,内存要爆炸了。但因为文件按自己设定格式写入的。每次要读的时候,知道应该从第几个字节读,读多少个长度

所以问此问题。请各位大佬看看这个问题有解么?但不用提供其他方案,比如写数据库之类的。甲方老项目要求,不支持修改原本方案

hackgsl 发表于 2022-6-19 23:37

可以逐行读取,
StreamReader sr = new StreamReader(path, Encoding.Default);
string line;
while ((line = sr.ReadLine()) != null)
{
        //逐行读取
}
sr.Close();

TakeKeyEasy 发表于 2022-6-20 00:16

可以考虑截取相应的长度存入数据库,然后读取出来后处理呢

ReLoading 发表于 2022-6-20 00:40

控制一下 开始位置和读取长度不就解决了


using System.IO;
class Program
{
    //循环读取大文本文件
    static void Main(string[] args)
    {
      FileStream fsRead;   
      string filePath="C:\\Users\\filedemo.txt"; //获取文件路径      
      try
      {
      fsRead = new FileStream(@filePath,FileMode.Open);//用FileStream文件流打开文件
      }
      catch (Exception)
      {
      throw;
      }
      long leftLength = fsRead.Length;//还没有读取的文件内容长度
      byte[] buffer = new byte; //创建接收文件内容的字节数组
          int maxLength=buffer.Length;//每次读取的最大字节数
      int num=0;//每次实际返回的字节数长度      
      int fileStart=0;//文件开始读取的位置
      while (leftLength>0)
      {      
      fsRead.Position=fileStart;//设置文件流的读取位置
      if (leftLength<maxLength)
      {
          num=fsRead.Read(buffer,0,Convert.ToInt32(leftLength));
      }
      else{
          num=fsRead.Read(buffer,0,maxLength);
      }
      if (num==0)
      {
          break;
      }
      fileStart += num;
      leftLength -= num;
      Console.WriteLine(Encoding.Default.GetString(buffer));
      }
      Console.WriteLine("end of line");
      fsRead.Close();
      Console.ReadKey();
    }
}

4028574 发表于 2022-6-20 08:21

            using FileStream fs = File.OpenRead(@"e:\desktop\5.md");
            fs.Seek(100, SeekOrigin.Begin); //设置要开始读取的位置,文件开头100个字节以后的地方开始
            byte[] buffer = new byte;
            int recvSize = fs.Read(buffer, 0, 1024);
            Console.WriteLine(Encoding.Default.GetString(buffer));

getstr88 发表于 2022-6-20 08:37

hackgsl 发表于 2022-6-19 23:37
可以逐行读取,
StreamReader sr = new StreamReader(path, Encoding.Default); ...
不行,读到指定行,就走几百万行,纯属浪费资源。况且,根本不是按行分隔。而是128KB对应1个自定义数据

getstr88 发表于 2022-6-20 08:38

TakeKeyEasy 发表于 2022-6-20 00:16
可以考虑截取相应的长度存入数据库,然后读取出来后处理呢

请看题目,说了不能数据库

getstr88 发表于 2022-6-20 08:40

感谢4楼和5楼。但问下,这样一开始File.read,不会把文件都读取是么

murder2008 发表于 2022-6-20 08:40

4#给出了方案,以二进制方式读取,打开文件后指定要偏移的位置

getstr88 发表于 2022-6-20 08:53

murder2008 发表于 2022-6-20 08:40
4#给出了方案,以二进制方式读取,打开文件后指定要偏移的位置

文本怎么处理? 一开始以为客户那边说每个数据128KB是定死的

结果刚才又说不行,因为是文本信息(且没有换行,而是用自定义的|作为数据分隔符)

那这样的话,没法准确知道是哪个位置

只能粗略取出那个位置,但是如何将那个位置的二进制变成文字(UTF-8)呢?关键是找到的那个位置,不一定是一个字符的开始,一个字符UTF-8是1--3字节,不一定一开始定位到哪个字节了
页: [1] 2 3
查看完整版本: C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大