如何使用VBA从混乱的CSV中导入数据

时间:2016-01-28 17:53:32

标签: sql vba excel-vba csv ado

这是一种"哪个方向最好"有点问题。 我有一个.CSV文件,它的格式不太理想。我将在下面的文件中绘制图表,以便您了解我正在谈论的内容。这个文件由供应商提供给我,供应商应该知道更好......(谷歌,咳嗽,黑客,咳嗽)。

使用VBA从这些数据中仅导入table2的最佳方法是什么?我将列出我在图表后尝试的方法。

.CSV文件如果打开则如下所示:

 Title Cell
 File Info Cell
 Time Date Cell

 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 Data1, Data 2
 ....(continues for around 800 rows)

 Second Table Title Cell
 Col1Title, Col2Title, ColTitle, Col4Title ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)    
 Data 3,    Data4,     Data 5,   Data6 ....(continues for around 50 columns)
 ...(Continues for around 1500 rows)
 End of CSV

到目前为止,我尝试过对ADODB对象,但是依赖于SQL查询(我的SQL知识有限)假设数据正确地形成为一个表 - 它不在这里。

我也一直在尝试逐行阅读文件。

我可以强制使用这两种方案中的任何一种,但两种方式都非常混乱。我觉得必须有干净的方法来做到这一点?

任何人都可以建议一种更好的方法或有效的方法来解决我已尝试过的方法吗?

提前致谢。

附录

@ user3724这就是我一直在逐行尝试的方法:

Open strFile For Input As #1

  countLine = 0

  Do Until EOF(1)
     Line Input #1, LineFromFile
     (Increment countLine)
     (Break line into array)
     (strComp() each element with the value for title of Table 2)
     (When strComp() returns true return countLine as upperValue)
     (Exit Loop)
 Loop

 countLine = 0

 Do Until EOF(1)
     Line Input #1, LineFromFile
     (Increment countLine)
     If countline is >= uppervalue
         (Parse line and return it to target row of target worksheet)
     End If
 Loop

当我对整个事情进行编码时,它是一个缓慢的混乱 - 很多if语句和循环内的循环。 @ user3724,您可以根据自己的经验来查看吗?

1 个答案:

答案 0 :(得分:1)

我没有评论的声誉......但我可以补充一下。 如果你想使用vba然后打开文件并逐行读取(例如使用行输入)省略行直到你检测到第二个空字符串,然后解析标题(接下来的两行)并将列标题存储在单独的数组中(使用redim保留或预定义)数组大小取决于文件格式)。其余的"秒"表只是逐行读取并解析每一行到数组(我推荐动态数组,第一维依赖于标题的数量)第二个暗淡的增加每个解析的行。 毕竟你将收到两个带有字段/列标题/名称的数组,第二个带有数据。两个阵列都具有相同的第一维。 第二阶段使用数组通过ado上传数据。 我使用这种方法将来自csv文件的ado导入数据导入到具有奇怪结构的csv文件中,就像你的

一样