在一个Excel文件中将大型CSV转换并加载到多个工作表

后面的故事:

来自pipe理的新项目:我已经从我的老板那里得到了一个软项目来评估我们目前的ETL计划之一,在这个过程中寻找改进的空间,我正在寻找指导。

MOTIVE:由于文件大小,Excel在当前正在被使用,并且在这个过程中经常崩溃。

任务:分析人员每个月都会收到一个调查供应商提供的大型csv文件,其中包含多达750个列(不是全部唯一的名称),超过15,000行,将大型csv文件简单地转换为Excel文件,其中7个工作表根据列标题在csv。 如何分解的细节如下。

我的问题是,一个大的csv被转换成多个工作表的编辑excel文件更容易或更快使用VB.NET和VS2010或VBA,或使用Excel是最简单的方法来继续这个过程? 我是一个专家Excel用户,但我仍然是一个初学者在VBA,VB.NET或任何其他语言的编码中间。


详细问题:

我愿意使用免费或开源软件,但我最熟悉VB.NET和Excel和Excel-VBA。 我已经玩了一些编码一个简单的Windows窗体应用程序来使用类似的TextFieldParser代码在这里find的csv加载到数据表。 我曾经想过把它加载到一个数组中,甚至是一个二维数组,以便更容易地编辑列标题并find重复的列标题。 datatable选项仍然留给我更多的问题比答案,因为我需要独特的列标题,并不知道如果我打算只写一个Excel文件,我是否应该打扰数据表。 我从CodeProject尝试CSVreader将无法处理具有重复标题名称的文件。 我觉得好像是有作家阻挡,因为我不知道我应该采取哪一个方向来处理这个过程。 你可以提供的任何input将非常感激,我很抱歉,如果这个问题没有一个明确的最好的答案,谢谢。


使用Excel的当前分析员任务

目前的分析计划表示分析人员在excel中打开csv,在第1行上面插入一行,并使用vlookup将“新”列名replace为基于单独的简单的两列查找表的“旧”列名工作表。 例如

New becomes Old "org-name" becomes "org_name" or "item_1_Vendor" becomes "item_1" or "date-created_Survey" becomes "date_created" etc...checking all sent "New" columns against the list of all possible 750 columns. 

然后粘贴第一行的值,然后删除包含我们想改变的新标题的第二行。

然后分析师必须修复名为“sid”的文件的主键。 调查ID字段(sid)应该有一个数字文件的每一行的数字。 有时sid显示在sid_HCAHPS或sid_CGCAHPS字段下。 分析师会在“sid”字段旁边插入一列,并在其中插入一个公式,例如: =IF(BE2<>"",BE2,IF(RD2<>"",RD2,IF(UH2<>"",UH2,"")))实际的单元格引用会改变,但是在excel公式的例子中,

 "sid"=Range("BE2") "sid_HCAHPS"=Range("RD2") "sid_CGCAHPS"=Range("UH2") 

一旦新创build的主键列没有空白,我们可以删除原来的“sid”列。

下一步是检查列,因为可能有一个冗余HCAHPS列的部分(由于第二次调查发送,然后返回 – 编码为波2),删除第二组列“sid_HCAHPS”到“语言”

接下来是最大的改动,因为我们已经build立了一个系统,我们把这个信息发送给我们的数据库pipe理员,以七个工作表excel文件的forms由MS Access查询加载,每个查询表创build一个表格,商业智能软件。 全做完了!!


是你的问题,“VB.net可以自动化我们目前的分析师任务吗? 如果是这样,那么是的。

您可以使用streamreader类从csv获取数据( http://msdn.microsoft.com/zh-cn/library/system.io.streamreader.aspx

然后将其存储在数组中,或者使用* list类( http://msdn.microsoft.com/zh-cn/library/6sh2ey19.aspx

一旦将所有数据存储起来,您将需要自动执行excel,这是相当直接的,但是也有一个链接可以让您开始使用它: http : //support.microsoft.com/kb/301982/en -gb

  • 通过列表类,您可以使用类或结构创build自定义对象的列表。 例如。

我们定义一个结构:

 Structure rowOfData Public intPrimaryKey as Integer Public strIceCreamName as String Public decPrice as Decimal End Structure 

然后我们可以创build一个rowOfData并为其添加属性:

 Dim iceCream1 as rowOfData iceCream1.intPrimaryKey = 1 iceCream1.strIceCreamName = "Mr Whippy" iceCream1.decPrice = 0.99 

我们创build一个列表:

 Dim listOfIceCreams as New List(of rowOfData) 

并添加到它像这样:

 listOfIceCreams.Add(iceCream1) listOfIceCreams.Add(iceCream2) etc. 

并像这样访问列表的成员:

 listOfIceCreams(0).decPrice 'gives us the price of the ice Cream that was added to the list first. 

还有很多其他有用的方法,列表有哪些数组没有。 你可以通过msdn list class链接来查看是否有任何东西跳出来,你可能需要