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