今天偶遇一同事抱怨,sqlserver导出的CSV,明明有1000W条,但用excel打开就只剩100W了,足足消失了90%,所以她怀疑文件是足量的1000W条,是excel捣了鬼。可是文件容量有2G+,用记事本打不开,如何证明CSV文件没有缺少数据,这可难坏了他。
好吧,本着不看其他轮子,有问题自己造一个的原则,我决定用控制台程序写一个简易读取程序,具体CODE如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BigTextReader{class Program{static void Main(string[] args){string path = "";do{Console.WriteLine("Please input the file path:");path = Console.ReadLine();}while (!System.IO.File.Exists(path));var fileStream = System.IO.File.OpenRead(path);while(true){Console.WriteLine("Please input the start position:");var position = Int64.Parse(Console.ReadLine());if (position == -1){Console.WriteLine("finish");return;}fileStream.Position = position;var byts = new Byte[1000];fileStream.Read(byts, 0, 1000);var str = Encoding.UTF8.GetString(byts);Console.WriteLine(str);}}}}
好了,程序如上图所示,第一步,输入文件的绝对地址,比如d:\a.csv,第二步,输入文本的位置,比如100000,程序默认读取1000个字节作展示。当位置输入为-1时,程序退出。
一个基本的大文本读取器就初见雏形了,用每个ROW的byte数*200W,果然读出了数据,完美的证明了同事的猜想,同时,读取的时间只用了100ms。
PS:个人感觉,Encoding,读取的byte数可以写作配置,但会拖长操作流程,同时,直接Int64.Parse是因为懒,小伙伴们不要效仿哦。