2010-03-16 146 views
1

我有一个CSV文件。第一行将始终包含列标题。根据各种因素,列的顺序可能会发生变化,并且在极少数情况下,某些列可能不存在。这些变化超出了我的控制范围。导入CSV文件时按列顺序处理更改

到目前为止,我的想法是关于如何解决这个问题。我将读取文件的第一行并使用这些值生成源文件中包含的列的列表。目标文件将使用与源相同的列名称。这应该与在源和目的地中搜索相同的名称一样简单,然后仅映射列索引值,对吗?

您对此有何建议?

+0

你想用CSV文件做什么?你只是简单地将文件转换成一个具有特定顺序的列?你打算为缺失的列插入空白值吗?你究竟想要完成什么? – 2010-03-16 16:08:38

+0

是的,这是一个简单的转换。如果该列在源文件中不存在,则它将在目标中为空。 – DenaliHardtail 2010-03-16 16:22:30

回答

0

我这样做了一次,通过构建我期望在那里的列的名称的哈希映射到实际存在的列标题的索引(或实际列名称)。我首先通过构建包含我期望的所有列名称作为关键字和一些值(如-1)作为值的地图来完成此任务。然后我得到了列标题数组。对于映射中所有键的循环以及文件中存在的所有标题,嵌套循环都经过了循环,我在删除空格后做了不区分大小写的比较,如果匹配,我将列的索引作为值为地图中的那个键。然后,在构建目标文件时,我只需循环显示CSV中每一行的映射中的键,并从映射中指定的索引获取数据,然后根据数据执行任何操作,而忽略列地图中的值为-1。我是用Java做的,但我想它在C#中几乎完全相同。

-1

如果我打算这样做,我会使用SQL和DAO。有2个技巧。第一个是建立到Excel工作表的连接,如果它是一个数据库表(您将需要DAO 3.6对象库作为VBA参考),

Dim dbtmp As dao.Database 
Dim qd As dao.QueryDef 

Set dbtmp = OpenDatabase(mPath & "\" & mName, False, True, "Excel 8.0;") 
Set qd = dbtmp.CreateQueryDef("", " THE QUERY ") 
qd.Execute 

,第二个是要建立作为数据源的CSV文件连接。的该格式是一样的东西:

mQuery = "SELECT * FROM [Text;HDR=NO;CharacterSet=437;DATABASE=" 
mQuery = mQuery & mpath 
mQuery = mQuery & "]." 
mQuery = mQuery & mfile 
mQuery = mQuery & ";" 

你将不得不使用代码来构建SQL,你需要建立在对的资源文件的字段,以及要构建INSERT INTO查询。使用名称创建对源数据的选择查询可能最简单,然后在插入到查询中时使用它。

这样做的好处是SQL将处理源数据中缺失的字段,而且对列的显示顺序不会太挑剔。您可以通过将csv作为文本文件打开来获取标题。