今天偶遇一同事抱怨,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是因为懒,小伙伴们不要效仿哦。