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
感謝浪人甲蟲大佬文章