C# 读取txt大文件

1GB以下

using System.Text;namespace DotnetReadTxt;class Program
{static void Main(string[] args){try{Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var gb2312 = Encoding.GetEncoding("GB2312");int index = 0;using (StreamReader sr = new StreamReader("ip20240529.txt",gb2312)){string line;// 逐行读取文件,直到读取完毕  while ((line = sr.ReadLine()) != null){// 在这里处理每一行,例如打印到控制台  index++;if (index < 10){Console.WriteLine(line);}}}Console.WriteLine("读取完毕~~");}catch (Exception e){// 处理可能出现的异常,例如文件不存在或没有读取权限等  Console.WriteLine("The file could not be read:");Console.WriteLine(e.Message);}}/// <summary>/// 获取文本文件的字符编码类型/// </summary>/// <param name="fileName"></param>/// <returns></returns>static Encoding GetTextFileEncodingType(string fileName){Encoding encoding = Encoding.Default;FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);BinaryReader binaryReader = new BinaryReader(fileStream, encoding);byte[] buffer = binaryReader.ReadBytes((int)fileStream.Length);binaryReader.Close();fileStream.Close();if (buffer.Length >= 3 && buffer[0] == 239 && buffer[1] == 187 && buffer[2] == 191){encoding = Encoding.UTF8;}else if (buffer.Length >= 3 && buffer[0] == 254 && buffer[1] == 255 && buffer[2] == 0){encoding = Encoding.BigEndianUnicode;}else if (buffer.Length >= 3 && buffer[0] == 255 && buffer[1] == 254 && buffer[2] == 65){encoding = Encoding.Unicode;}else if (IsUTF8Bytes(buffer)){encoding = Encoding.UTF8;}return encoding;}/// <summary>/// 判断是否是不带 BOM 的 UTF8 格式/// BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。/// </summary>/// <param name="data"></param>/// <returns></returns>private static bool IsUTF8Bytes(byte[] data){int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++){curByte = data[i];if (charByteCounter == 1){if (curByte >= 0x80){//判断当前 while (((curByte <<= 1) & 0x80) != 0){charByteCounter++;}//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6){return false;}}}else{//若是UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80){return false;}charByteCounter--;}}if (charByteCounter > 1){throw new Exception("非预期的byte格式");}return true;}
}

1GB以上

ReadTxtFileLine.cs

using System.Text;namespace DotnetReadTxt;/// <summary>
/// 本类用于使用StreamReader.Read()方法,实现逐行读取文本文件,
/// </summary>
public class ReadTxtFileLine
{//文件读取的状态,当为false时,代表未读完最后一行,true为读完了最后一行int _IsReadEnd = 0;System.IO.StreamReader sr1;int _LoopRowNumNow = 0;//定义了一个是否读到最后的属性,数据类型为整数,大于0未读到,等于0是表示末尾了public int IsReadEnd{get => _IsReadEnd;}//构造函数public ReadTxtFileLine(string TxtFilePath, Encoding FileEncoding){sr1 = new System.IO.StreamReader(TxtFilePath, FileEncoding);_IsReadEnd = 1;}//成员方法,执行一次,返回1行的结果,当全部读完,依然执行该方法,将返回空字符串""public string GetLineStr(){string strLine = "";int charCode = 0;while (sr1.Peek() > 0){charCode = sr1.Read();if (charCode == 10) //发现换行符char10就返回拼接字符串{_LoopRowNumNow++;return strLine;}else{if (charCode != 13){//将一行的数据重新拼接起来strLine += ((char)charCode).ToString();}}}_IsReadEnd = -1;sr1.Close();sr1.Dispose();return strLine;}
}

使用

static void Main(string[] args){try{Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var gb2312 = Encoding.GetEncoding("GB2312");ReadTxtFileLine ReadTxtFileTest1 = new ReadTxtFileLine("ip20240529.txt", gb2312);int index = 0;while (ReadTxtFileTest1.IsReadEnd>0){//这里将读出来的1行赋值给strstring str = ReadTxtFileTest1.GetLineStr();index++;if (index < 10){Console.WriteLine(str);}}Console.WriteLine("读取完毕~~");}catch (Exception e){// 处理可能出现的异常,例如文件不存在或没有读取权限等  Console.WriteLine("The file could not be read:");Console.WriteLine(e.Message);}}

gb2312读取需要安装一个库System.Text.Encoding.CodePages
感谢浪人甲虫大佬文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda与pip的镜像源与代理设置

conda与pip的镜像源与代理设置 一、前言二、conda镜像源设置2.1conda默认镜像源介绍2.2通过终端设置镜像源2.3通过配置文件设置镜像源 三、pip镜像源设置3.1pip默认镜像源介绍3.2通过终端临时设置镜像源3.3通过配置文件设置一个或多个镜像源 四、conda代理设置4.1通过终端设置代…

数据结构与算法笔记:基础篇 - 栈:如何实现浏览器的前进和后退功能?

概述 浏览器的前进、后退功能&#xff0c;你肯定很熟悉吧&#xff1f; 当依次访问完一串页面 a-b-c 之后&#xff0c;点击浏览器的后退按钮&#xff0c;就可以查看之前浏览过的页面 b 和 a。当后退到页面 a&#xff0c;点击前进按钮&#xff0c;就可以重新查看页面 b 和 c。但…

放开了去的 ulimit

放开了去的 ulimit 放开了去的 ulimitulimit简介临时修改打开文件数目永久修改系统总打开句柄限制更多信息 放开了去的 ulimit ulimit简介 对于高并发或者频繁读写文件的应用程序而言&#xff0c;有时可能需要修改系统能够打开的最多文件句柄数&#xff0c;否则就可能会出现t…

HTTPS 原理技术

HTTPS原理技术 背景简介原理总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内容并非完全原创&am…

Element-ui使用上传时弹框选择文件类型

实现效果 1&#xff0c;点击上传&#xff0c;上传文件&#xff1b; 2&#xff0c;选择文件&#xff1b; 3&#xff0c;弹框选择文件类型&#xff1b; 4&#xff0c;选择类型后确定上传&#xff1b; 一&#xff0c;上传 跳过&#xff1b; 二&#xff0c;定义弹框下拉框…

Coolmuster Android Assistant: 手机数据管理的全能助手

在数字化时代&#xff0c;智能手机不仅是通讯工具&#xff0c;更是个人数据的中心。随着数据量的不断增加&#xff0c;如何有效管理和保护这些数据成为了一个重要议题。Coolmuster Android Assistant应运而生&#xff0c;它是一款专为安卓用户设计的综合数据管理软件&#xff0…

EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?

在excel里&#xff0c;这个果然是有个设置的地方&#xff0c;修改后就好了。 点击文件选项卡&#xff0c;选项&#xff0c;在高级里&#xff0c;将图示选项的勾选给取消&#xff0c;然后再创建数据透视表或透视图&#xff0c;日期就不会自动组合了&#xff1a; 这个选项只对新…

遥感图像的深度学习的任务类型

在遥感图像的深度学习任务中&#xff0c;利用深度学习技术处理和分析遥感图像已经成为一个重要的研究方向。遥感图像来自卫星、无人机等设备&#xff0c;包含了丰富的地球表面信息。以下是遥感图像深度学习中的主要任务类型&#xff1a; 1. 图像分类&#xff08;Image Classif…

Flutter 中的 SliverPrototypeExtentList 小部件:全面指南

Flutter 中的 SliverPrototypeExtentList 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverPrototypeExtentLis…

山东理工大学第十六届ACM程序设计竞赛(同步赛)

山东理工大学第十六届ACM程序设计竞赛&#xff08;同步赛&#xff09; B、Q的网课 1、创建一个结构体&#xff0c;来保存我们要输入的网课名和学时&#xff0c;并且对学时初始化为-1 2、然后w次输入网课名&#xff0c;对每次输入减去原先网课名对应学时&#xff0c;统计网课剩余…

关于torch.size和tensor的维度笔记

torch.Size([200, 1])和torch.Size([200])的区别是什么? torch.Size([200, 1]) 和 torch.Size([200]) 是两个不同形状的张量 (tensor) 大小。它们的区别如下&#xff1a; torch.Size([200, 1]): 这是一个2D张量&#xff0c;形状是200行1列。这种形状通常用来表示一个列向量或…

suffix-tree教程(个人总结)

背景 在计算机科学和生物信息学中&#xff0c;字符串处理是一个非常重要的领域。无论是搜索引擎、基因序列分析&#xff0c;还是压缩算法&#xff0c;都离不开高效的字符串处理。传统的字符串匹配算法&#xff0c;如暴力搜索、Knuth-Morris-Pratt (KMP) 算法和 Boyer-Moore 算…

Android14 WMS-IWindow介绍

IWindow是很重要的&#xff0c;官方介绍是API back to a client window that the Window Manager uses to inform it of interesting things happening. 也就是说是是用于WMS回调客户端的&#xff0c;当窗口有一些改变时&#xff0c;WMS及时调用客户端接口&#xff0c;让客户端…

Ubuntu22.04之解决:忘记登录密码(二百三十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

gpt-4o api申请开发部署应用:一篇全面的指南

利用 GPT-4o API 开发创新应用&#xff1a;一篇全面的指南 OpenAI 的 GPT-4o 是一款集成了音频、视觉和文本处理能力的多模态人工智能模型&#xff0c;它的出现代表了人工智能领域的重大进步。在本篇文章中&#xff0c;我们将详细介绍如何通过 OpenAI API 使用 GPT-4o&#xf…

html中 table的 colspan和rowspan

Colspan 单元格跨越多列; Rowspan 单元格跨越多行 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body><h4>单元格跨两列:</h4> <table border"1"&…

蓝桥杯java组-字符串输入输出处理

题目描述&#xff1a;字符串的输入输出处理。 输入&#xff1a;第一行是一个正整数N&#xff0c;最大为100。之后是多行字符串&#xff08;行数大于N&#xff09;&#xff0c; 每一行字符串可能含有空格&#xff0c;字符数不超过1000。 输出&#xff1a;先将输入中的前N行字符…

云动态摘要 2024-05-31

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [1.5折起]年中盛惠--AI分会场 腾讯云 2024-05-30 人脸核身、语音识别、文字识别、数智人、腾讯混元等热门AI产品特惠&#xff0c;1.5折起 云服务器ECS试用产品续用 阿里云 2024-04-14 云…

鸿蒙开发接口媒体:【@ohos.multimedia.medialibrary (媒体库管理)】

媒体库管理 说明&#xff1a; 该组件从API Version 6开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入模块 …

2.4 Docker部署JDK

2.4 Docker部署JDK jdk17部署&#xff08;自定义镜像&#xff09; 1.在官网上下载jdk-17_linux-x64_bin.tar.gz&#xff0c;并安装到/usr/local目录下 cd /usr/local2.创建Dockerfile vim Dockerfile# 基于官方的Ubuntu 20.04镜像作为基础镜像 FROM ubuntu:20.04# 设置环境…