我有多个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的所有数据.现在,您可以执行所有业务逻辑,然后从那里执行任何操作.不是最漂亮的解决方案,但鉴于我的情况/数据流/大小/要求,我*开发该解决方案.您可能会选择完全不同的东西.我猜只是分享.