1

背景故事:

来自管理层的新项目:我的老板给了我一个软项目,以评估我们当前的 ETL 计划之一,以在流程中寻找改进空间,我正在寻求指导。

动机:由于文件大小,当前正在使用 Excel,并且在此过程中经常崩溃。

任务:分析师每个月都会收到来自调查供应商的大型 csv 文件,其中包含多达 750 列(并非所有唯一名称),超过 15,000 行,只需将大型 csv 文件转换为 excel 文件,其中包含根据列分解的七个工作表csv 中的标题。下面是如何分解的详细信息。

我的问题是使用 VB.NET 和 VS2010 或 VBA 将一个大型 csv 转换为具有多个工作表的编辑过的 excel 文件,或者使用 Excel 是继续此过程的最简单方法吗?我是 Excel 专家用户,但我仍然是 VBA、VB.NET 或任何其他语言编码的初学者。


详细问题:

我愿意使用免费或开源软件,但我最熟悉 VB.NET 和 Excel 以及 Excel-VBA。我已经使用类似的TextFieldParser 代码对一个简单的 Windows 窗体应用程序进行了一些编码,以将 csv 加载到数据表中。我曾考虑将其加载到数组甚至二维数组中,以便更轻松地编辑列标题并找到重复的列标题。数据表选项仍然给我留下了比答案更多的问题,因为我需要唯一的列标题,并且如果我要立即编写一个 Excel 文件,我不确定是否应该使用数据表。我从 CodeProject 尝试了 CSVreader不适用于具有重复标题名称的文件。我觉得好像我被作家阻止了,因为我不确定我应该采取哪个方向来处理这样的过程。您可以提供的任何输入将不胜感激,如果这个问题没有一个单一且清晰的最佳答案,我深表歉意,谢谢。


当前使用 excel 的 Analyst 任务

当前的分析计划已表示分析师在 excel 中打开 csv,在第 1 行上方插入一行并使用 vlookup 将“新”列名称替换为“旧”列名称,基于单独的简单两列查找表工作表。例如

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")

一旦新创建的主键列被制作并填充不空白,我们可以删除原来的“sid”列。

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

接下来是最大的改变,因为我们已经设置了一个系统,我们将这些信息以七个工作表 excel 文件的形式发送给我们的数据库管理员,由 MS Access Query 加载,该查询从加载到我们专有的每个工作表中创建一个表商业智能软件。全部完成!!


4

1 回答 1

2

您的问题是“VB.net 能否自动化我们当前的分析师任务?” - 如果是这样,那么是的。

您可以使用 streamreader 类从您的 csv ( http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx )中获取数据

然后将其存储在您提到的数组中或使用 *list 类(http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

存储完所有数据后,您需要自动化 excel,这非常简单,但这里有一个链接可以让您开始使用它:http: //support.microsoft.com/kb/301982/en -gb

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

我们定义一个结构:

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

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

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

我们创建一个列表:

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 列表类链接,看看是否有任何您可能需要的东西跳出来

于 2013-07-26T10:00:22.813 回答