导入CSV文件时按列顺序处理更改

我有一个CSV文件。 第一行将始终包含列标题。 取决于各种因素,列的顺序可能会改变,在极less数情况下,某些列可能不存在。 这些变化是我无法控制的。

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

你有什么build议来处理这个?

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

如果我要这样做,我会使用SQL和DAO。 有2个技巧。 第一个是build立到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 

第二个是build立到CSV文件的连接作为数据源。 这种格式是这样的:

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

您必须使用代码构buildSQL,您需要在源文件中build立字段,并且正在构buildINSERT INTO查询。 使用名称创build对源数据的select查询可能是最简单的,然后在插入查询中使用它

这样做的好处是,SQL将关注源数据中的缺失字段,并且不会对列出现的顺序感到疑惑。可以通过将csv作为文本文件打开来获取标题。