C# 处理千万行csv文件读写

问题描述:需要将一个csv格式的表格文件转换成我想要的表格内容形式。(前四行的每个竖列转换成每行得横列,然后第五行得横列于前三行结合拼接成一行,类似这种得样式)


待转格式
转换后

最开始写的时候用的是Microsoft.Office.Interop.Excel库,挨个单元格读excel然后再挨个单元格写入文件,谁用谁知道,刚开始没用多大的文件就几兆大概转换完的时间要个半小时,但是我们这边需要转的竟然大多都是上百兆得文件,转换后粗滤算下需要两千多万行,excel文件最多也就只能有一百多万行。
一次要转换几十个文件照这个速度要一周,得!重写。
由于之前也写过一个读千万行的csv文件,与之不同的是,只要读,不要文件处理,每读五百行转换成json传给客户,用的StreamReader,由于我的excel要做文件处理,StreamReader是按行读,效率快但是想直接操作单元格数据还要自己处理,我就抱着试试心态重写了一份。利用StreamReader读,StreamWriter写。

         StringBuilder sbData = new StringBuilder();
                StringBuilder nsbData = new StringBuilder();
                string sbHeader = sb.ToString();
                //sbData = sb;
                System.IO.FileStream fs = null;
                StreamWriter sw = null;
                try
                {
                    sbData.Append(sbHeader);
                    for (int k = 1; k <= (wsRows - paraLine); k++)//(wsRows - paraLine)
                    {
                        lineTxt = reader.ReadLine();
                        nLineCount++;
                        string[] split = lineTxt.Split(',');
                        for (int i = colTemp; i < wsColumns; i++)
                        {
                            if (split[i].ToString() == "")
                            {
                                breakCount = breakCount +( wsColumns - split.Length-1);
                                break;
                            }
                            if (float.Parse(split[i].ToString()) <= float.Parse(d[i].ToString()) && (float.Parse(split[i].ToString()) >= float.Parse(c[i].ToString())))
                            {
                                testResult = "PASS";
                            }
                            else
                            {
                                testResult = "FAIL";
                            }

                            sbData.Append("***\t");
                            sbData.Append("*****\t");
                            sbData.Append("******D3\t");
                            sbData.Append(barName + "\t");
                            sbData.Append(barCode + "\t");
                            sbData.Append(k + "\t");
                            sbData.Append("\t");
                            sbData.Append("\t");
                            sbData.Append(processBatch + "\t");
                            sbData.Append(productLine + "\t");
                            sbData.Append(testEquip + "\t");
                            sbData.Append(testTime + "\t");
                            sbData.Append(testType + "\t");
                            sbData.Append(testProcess + "\t");
                            sbData.Append(a[i].ToString() + "\t");
                            sbData.Append(testCondition + "\t");
                            sbData.Append(c[i].ToString() + "\t");
                            sbData.Append(d[i].ToString() + "\t");
                            sbData.Append(b[i].ToString() + "\t");
                            sbData.Append(split[i].ToString() + "\t");
                            sbData.Append("\t");
                            sbData.Append(testResult + "\t");
                            sbData.Append("\t");
                            sbData.Append(Environment.NewLine);

                            dataLineCount++;
                            backgroundWorker1.ReportProgress(k * 100 / (wsRows - paraLine), "正在转换文件:" + "..\\" + fileName);//(dataLineCount * 100) / ((wsRows - paraLine) * (wsColumns - 6)-breakCount)
                            if (dataLineCount % 800000 == 0)//每80万行写入一个文件
                            {
                                m_strSavePath = m_strFullFilePath + "\\" + "ic***-****-***-" + productName + "-" + customerLotNo + "-" + processBatch + "-" + DateTime.Now.ToString("yyyyMMddhhmmssfff") + "-" + fileCount + ".csv";
                                fs = new FileStream(m_strSavePath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                                sw = new StreamWriter(fs, new System.Text.UnicodeEncoding());
                                sw.Write(sbData.ToString());
                                sw.Flush();
                                sw.Close();
                                sw.Dispose();
                                sbData.Clear();
                                sbData.Append(sbHeader);
                                fileCount++;
                            }
                        }
                    }
                }

核心就是按照行读,再把自己数据处理成一行,再按照行写。
遇到的问题就是内存溢出,由于数据量大,转换速度快,一开始打算每读一百万行保存成一个文件,但是电脑配置有限,该成八十万就ok了。可以根据自己电脑实际情况来。
改了之后再重新传,速度飞快。几千万行的绝对十分钟之内。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351