如何使用 VBA 从混乱的 CSV 文件中导入数据
How to import data from a messed up CSV using VBA
这是一个 "which direction is best" 类的问题。
我有一个格式不太理想的 .CSV 文件。我将在下面绘制文件,以便您了解我在说什么。这个文件是由一个供应商提供给我的,他应该更了解......(Google,咳嗽,哈克,咳嗽)。
使用 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 知识)假设数据被正确格式化为 table - 它不在这里。
我也一直在尝试逐行读取文件。
我可以强制使用这两种解决方案中的任何一种,但两种方式都非常混乱。我觉得必须有干净的方法来做到这一点?
任何人都可以针对我已经尝试过的方法提出更好的方法或有效的方法吗?
提前致谢。
附录
@ 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,你能根据你的经验回顾一下吗?
我没有评论的名誉...但我可以添加答案。
如果你想使用 vba 然后打开文件并逐行读取(例如使用行输入)省略行直到你检测到第二个空字符串,然后解析 headers (接下来的两行)并存储列 headers 在单独的数组中(使用 redim 保留或预定义的数组大小,这取决于文件格式)。 "second" table 的其余部分只是逐行读取并将每一行解析为数组(我建议第一维的动态数组依赖于 headers 的计数)第二个暗淡随着每个解析行的增加.
毕竟你会收到两个数组,一个是 field/column captions/names,第二个是数据。两个数组具有相同的第一维。
第二阶段使用数组通过ado上传数据。
我使用了从 csv 文件中通过 ado 将数据导入 db 的方法,这些文件的结构很奇怪,就像你的一样
这是一个 "which direction is best" 类的问题。 我有一个格式不太理想的 .CSV 文件。我将在下面绘制文件,以便您了解我在说什么。这个文件是由一个供应商提供给我的,他应该更了解......(Google,咳嗽,哈克,咳嗽)。
使用 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 知识)假设数据被正确格式化为 table - 它不在这里。
我也一直在尝试逐行读取文件。
我可以强制使用这两种解决方案中的任何一种,但两种方式都非常混乱。我觉得必须有干净的方法来做到这一点?
任何人都可以针对我已经尝试过的方法提出更好的方法或有效的方法吗?
提前致谢。
附录
@ 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,你能根据你的经验回顾一下吗?
我没有评论的名誉...但我可以添加答案。 如果你想使用 vba 然后打开文件并逐行读取(例如使用行输入)省略行直到你检测到第二个空字符串,然后解析 headers (接下来的两行)并存储列 headers 在单独的数组中(使用 redim 保留或预定义的数组大小,这取决于文件格式)。 "second" table 的其余部分只是逐行读取并将每一行解析为数组(我建议第一维的动态数组依赖于 headers 的计数)第二个暗淡随着每个解析行的增加. 毕竟你会收到两个数组,一个是 field/column captions/names,第二个是数据。两个数组具有相同的第一维。 第二阶段使用数组通过ado上传数据。 我使用了从 csv 文件中通过 ado 将数据导入 db 的方法,这些文件的结构很奇怪,就像你的一样