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

Posted

技术标签:

【中文标题】如何使用 VBA 从混乱的 CSV 导入数据【英文标题】:How to import data from a messed up CSV using VBA 【发布时间】:2016-01-28 17:53:31 【问题描述】:

这是一个“哪个方向最好”的问题。 我有一个格式不太理想的 .CSV 文件。我将在下面绘制文件图表,以便您可以看到我在说什么。这个文件是由一个应该更了解的供应商提供给我的......(Google,cough,hack,cough)。

使用 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,你能根据你的经验回顾一下吗?

【问题讨论】:

导入到哪里对不起? SQL Server? 在 Excel 中打开文件并解析工作表中的数据? 我做了一些修改。我只想将此数据中的 Table2 导入 Excel 电子表格 - 当然使用 VBA。 Table2 = "第二张桌子" 【参考方案1】:

我没有评论的声誉......但我可能会添加答案。 如果您想使用 vba,则打开文件并逐行读取(例如使用行输入)省略行,直到检测到第二个空字符串,然后解析标题(接下来的两行)并将列标题存储在单独的数组中(使用 redim preserve 或预定义数组大小取决于文件格式)。 “第二个”表的其余部分只是逐行读取并将每一行解析为数组(我推荐动态数组,第一维依赖于标题的数量)第二个暗淡随着每个解析的行增加。 毕竟,您将收到两个数组,一个带有字段/列标题/名称,第二个带有数据。两个数组具有相同的第一维。 第二阶段通过ado使用数组上传数据。 我使用的方法是通过 ado 从结构怪异的 csv 文件中将数据导入 db,就像你的一样

【讨论】:

感谢您的回复。看起来你喜欢你有一个很好的解决方案,但你的答案有点密集(或者我有点密集......)。你能提供一个快速的例子吗?我将在问题的附录中包含我目前正在试验的内容。 这里:yadi.sk/d/ocV-wDNonvnTG 存档中有两个文件。第一个是 *.xlsm,第二个是 *.csv 自己检查和修改 感谢下载,很有启发。是否有理由通过这种方法使用 ADO?如果我已经将想要的行解析到内存中,为什么只将它们写入我的 Excel 工作表?还是我缺少什么? 没关系,可能我误解了你...目标是将数据解析到内存中...如果您必须用导入的数据填写excel工作表,只需将数据写下来...当然没有需要使用 ADO...抱歉让您感到困惑。 经过多次测试,我发现这是最好的方法。当我将 CSV 附加到以前导入的数据时,我添加了一个比较函数来比较列名。除此之外,这是一个很好的答案-非常感谢。

以上是关于如何使用 VBA 从混乱的 CSV 导入数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CSV 数据导入多个数组并通过 VBA 中的函数或子函数返回多个数组?

访问 VBA - 导入 *.CSV 时出现运行时错误 31519。您无法导入此文件

通过vba从查询创建.csv文件

通过 ADO 将没有标题的 CSV 文件导入 VBA

VBA 程序仅将选定的 csv 文件(从一个文件夹)导入到访问中的单个表中

将数据从csv导入excel