C#分段读取超大文本文件

2023-11-17

一、概述

通过C#分段读取和操作超大内存的文本文件,保证操作大于3GB的txt时内存不会爆,包括获取txt文件总行数,按行分段等。

二、操作流程

1.读取文件总行数

///获取txt的总行数
public int GetTunnelInfos(string txtPath)
{
	 int count = 0string line = "";
     StreamReader sr = new StreamReader(txtPath);  //创建一个StreamReader的实例来读取文件
     //按行读取
     while (sr.Peek() >= 0)   //每次读多少数据
     {
         line = sr.ReadLine();
         count++;
     }
     sr.Close();
     return count - 1;
 }

2.从txt中读一段数据

int isFirst = 0;  //跳过整个txt的第一行而不是每一段的第一行都跳过

/// <summary>
/// 从txt中读取一段数据
/// </summary>
/// <param name="totalNums">txt数据总行数</param>
/// <param name="segmentNums"><每一段有多少行/param>
/// <param name="oneSegmentLines">一段数据</param>
/// <param name="_currentLine">当前读到了哪一行</param>
/// <returns></returns>
public List<Infos> ReadPointsSegmented(int totalNums, int segmentNums, IEnumerable<string> oneSegmentLines, int _currentLine)
{
    List<Infos> points = new List<Infos>();   //存储读取的点云点坐标和颜色值
    Infos info;   //Infos是一个一个结构体,用于记录一行数据的信息
    var lines = oneSegmentLines.Skip(_currentLine).Take(segmentNums);   //Skip:从_currentLine开始截取    Take:截取多少个
    if (_currentLine < totalNums)
    {
        foreach (var line in lines)
        {
            string[] tmp = line.Split(' ');
            if ((isFirst == 0) && char.IsLetter(Convert.ToChar(tmp[0].Substring(0, 1))))   //判断第一行是否为数字
            {
                isFirst = 1;
                continue;
            }
            info.X = Convert.ToDouble(tmp[0]);
            info.Y = Convert.ToDouble(tmp[1]);
            info.Z = Convert.ToDouble(tmp[2]);
            info.W = Convert.ToDouble(tmp[3]);
            points.Add(info);
        }
    }
    return points;
}

3.循环读取整个txt中的每一段

private void ReadLargeTxt(string txtPath)
{
    int segmentNums = 400000;  //每段读多少行数据
    int totalNums =  GetTunnelInfos(txtPath);  //总点数
    int segments = totalNums / segmentNums;  //段数
    int _currentLine = 0;  //从第一行开始分段并读取

    IEnumerable<string> lines = File.ReadLines(cloudPointsPath, Encoding.UTF8);
    for (int i = 0; i < segments + 1; i++)  //按segments个段读取点云数据
    {
        points = ReadPointsSegmented(totalNums, segmentNums, lines, _currentLine);  //取一段
		/*
		.........(添加对每一段数据进行操作的代码)
		*/
        if (points.Count != 0)
        {
            if (i < segments)
                _currentLine += segmentNums;
            else
                _currentLine += totalNums % segmentNums;   //取最后一段
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#分段读取超大文本文件 的相关文章

随机推荐

  • Vue Baidu Map组件封装:多边形组件和右键菜单

    在Vue上进行开发 地图使用了百度提供的Vue Baidu Map 当前版本为v0 21 15 官方文档地址 https dafrok github io vue baidu map zh index 开发需求 在百度地图上动态进行多边形的
  • 【JavaSe】高级特性篇(三) Java高级特性注解

    JavaSe 高级特性篇 三 Java高级特性注解 1 注解 Annotation 概述 1 1 定义 定义 注解 Annotation 也叫元数据 一种代码级别的说明 它是JDK1 5及以后版本引入的一个特性 与类 接口 枚举是在同一个层
  • Redis-五种数据结构

    1 五种数据结构图解如下 1 1 String数据结构 命令 get set del incr decrget set del incr decr 联想java map
  • Matplotlib绘制漂亮的饼状图

    python绘图系列文章目录 往期python绘图合集 python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取exc
  • 【满分】【华为OD机试真题2023 JAVA&JS】计算网络信号

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 计算网络信号 知识点广搜数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网
  • MISC方向MeowMeowMeow解题方法

    下载好附件后 通过好多工具都没有找到flag 突发奇想通过010工具打开MeowMeow png 发现了一堆乱码 当划到最下面的时候 发现了那些乱码有一定的规律 这个时候向上找 找到最开始出现规律的位置 会发现与题目给的flag格式CatC
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的 3n 1 猜想 15 分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1
  • 函数模板全特化与偏特化

    模板为什么要特化 因为编译器认为 对于特定的类型 如果你能对某一功能更好的实现 那么就该听你的 模板分为类模板与函数模板 特化分为全特化与偏特化 全特化就是限定死模板实现的具体类型 偏特化就是如果这个模板有多个类型 那么只限定其中的一部分
  • 7 个非常实用的 Vue.js 库

    编辑整理 杨小爱 我们在开发项目的时候 为了提升开发效率 会经常使用一些实用的开发库 而Vue js 又是前端领域中很受欢迎的框架之一 因此 就有很多开发者开发了各种实用的库 在这里 我整理了 7 个觉得好用的 Vue js 库 希望这些库
  • Acwing 795. 前缀和

    include
  • Go测试学习

    前言 textcolor Green 前言 前言 这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 从这个专栏里面可以迅速获得Go的知识 Go测试学习 03 测试 3 1 单元测试 3 1 1 单元测试 规则 3 1 2 单元测试 例
  • Linux安装Tomcat详细教程

    一 安装前提 Tomcat依赖于Java环境 所以在运行Tomcat之前 我们需要提前配置好Java环境变量 可以参考以往教程 Linux安装Java详细教程 注 Tomcat和Java使用版本最好保持一致 如果用的JDK1 8 那么最好就
  • 三维模型3DTile格式轻量化压缩模型变形浅析

    三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中 常常会出现模型变形的现象 这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素 以下将对此现象进行详细分析 首先 我们需要了解三维模型轻量化压缩的
  • 有限自动机总结

    有限自动机A用来识别字符串 它由5部分组成 1 alphabet 字符集 2 states 状态集合 3 init 初始状态 4 trans s ch 状态转移函数 5 end 可接受state 集合 A str true的意思是 A可以接
  • unity中mathf.Lerp的运用

    在unity3d中经常用线性插值函数Lerp 来在两者之间插值 两者之间可以是两个材质之间 两个向量之间 两个浮点数之间 两个颜色之间 其函数原型如下 1 Material Lerp 插值 function Lerp start Mater
  • 03目标检测-传统方法与深度学习算法对比

    一 目标学习的检测方法变迁及对比 目标检测 是当前计算机视觉和机器学习领域的研究热点 从Viola Jones Detector DPM等冷兵器时代的智慧到当今RCNN YOLO等深度学习土壤孕育下的GPU暴力美学 整个目标检测的发展可谓是
  • 在SpringBoot中使用百度AI,实现通用图片识别(身份证识别也通用)

    现在网上有好多第三方使用的文章 但是没几个是可以使用的 本片文章可以放心使用哦 3 1 先去百度ai官网注册一个账号 2 选择我们需要使用的功能 3 因为我们这个是测试使用 他每天会有很多次免费使用的次数 因此完全够用 4 去领取我们需要的
  • 结巴分词jieba添加自定义词典

    结巴分词添加自定义词典 有时候很有必要 比如下面这段话 test text 我们的健康码也是绿色的 这凭什么就限制我们的就医 如果使用默认的分词 那么 健康码 这个词会分成 健康 和 码 这里可以使用词典方式 添加自定义词典 新建一个txt
  • mysql写存储过程插入数据

    DROP PROCEDURE if exists insert emps test 下面就开始创建存储过程插入数据 DELIMITER 不加这个会报错 坑了我两个小时CREATE PROCEDURE insert emps test IN
  • C#分段读取超大文本文件

    一 概述 通过C 分段读取和操作超大内存的文本文件 保证操作大于3GB的txt时内存不会爆 包括获取txt文件总行数 按行分段等 二 操作流程 1 读取文件总行数 获取txt的总行数 public int GetTunnelInfos st