ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#CSV动态拆分

2019-12-02 06:06:19  阅读:476  来源: 互联网

标签:streamreader csv linq c net


我有多个1.5 GB的CSV文件,其中包含来自服务提供商的多个帐户的账单信息.我正在尝试将大型CSV文件拆分为较小的块,以便处理和格式化其中的数据.

我不想推出自己的CSV解析器,但这是我尚未看到的东西,因此如果我错了,请更正我. 1.5GB文件按以下顺序包含信息:帐户信息,帐号,账单日期,交易,Ex gst,Inc gst,类型和其他行.

请注意,此处的BillDate表示开具发票的日期,因此有时我们在同一CSV中有两个以上的发票日期.

帐单按以下类别分组:帐号>帐单日期>交易.

有些帐户有10行交易明细,有些帐户有300,000行以上交易明细.一个1.5GB的大型CSV文件包含大约800万行数据(我之前使用过UltraEdit)将粘贴切成较小的块,但这变得非常低效且耗时.

我只想在WinForm中加载较大的CSV文件,单击一个按钮,它将把这些较大的文件拆分为不超过250,000行的块,但是某些账单实际上大于250,000行,在这种情况下,将它们合为一体,无论如何,不​​要将帐户拆分为多个文件.另外,我也不想在CSV中使用多个帐单日期进行结算,在这种情况下,拆分器可以创建另一个附加拆分.

我已经有一个WinForm应用程序,可以在VS C#2010中自动以较小的文件格式格式化CSV.

实际上有可能处理这个非常大的CSV文件吗?我一直在尝试加载大文件,但是MemoryOutOfException令人烦恼,因为它每次都崩溃,并且我不知道如何解决它.我愿意提出建议.

这是我想应该做的:

>加载大型CSV文件(但由于OutOfMemoryException而失败).如何解决呢?
>按帐户名称,账单日期对数据进行分组,并对每个组的行数进行计数.
>然后创建一个整数数组.
>将此整数数组传递给文件拆分器进程,该进程将采用这些数组并写入数据块.

任何建议将不胜感激.

谢谢.

解决方法:

是的,关于….内存不足将发生在巨大的文件中.您需要认真对待您的情况.

与大多数问题一样,将所有步骤分成几步.

之前我也遇到过类似的情况(CSV格式的大数据文件,需要处理等).

我做了什么:

进行程序套件的第1步之类的操作,仅仅是将巨大的文件切成许多较小的文件.我已经将5GB压缩的PGP加密文件(解密后……这又令人头疼)分解成许多小块.您可以执行一些简单的操作,例如按顺序编号(即001、002、003 …)

然后制作一个应用程序进行输入处理.这里没有真正的业务逻辑.当涉及到业务逻辑时,我非常讨厌FILE IO,并且我喜欢数据存储在一个不错的SQL Server DB中的那种模糊的感觉.这就是我.我创建了一个线程池,并拥有N个线程(例如5个线程,您可以决定计算机可以处理的线程数量)读取您创建的那些.csv零件文件.

每个线程读取一个文件.一对一的关系.因为它是文件I / O,所以请确保您没有同时运行太多.每个线程执行相同的基本操作.读入数据,将其放入db(表格式)的基本结构中,进行大量插入,然后结束线程.我之所以使用LINQ to SQL,是因为所有类型都是强类型,不是强类型,而是每个都有自己的类型.数据库设计越好,您以后进行逻辑处理就越好.

在所有线程完成执行之后,您将具有数据库中原始CSV的所有数据.现在,您可以执行所有业务逻辑,然后从那里执行任何操作.不是最漂亮的解决方案,但鉴于我的情况/数据流/大小/要求,我被迫开发该解决方案.您可能会选择完全不同的东西.我猜只是分享.

标签:streamreader,csv,linq,c,net
来源: https://codeday.me/bug/20191202/2086371.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有