0

我正在使用来自外部源的输出文件 (CSV) - 用于进行数据抓取。

但是,“报废”的网页没有相同的精确模式,因此在输出文件(Excel)中,我有偏移的列。幸运的是,这些值包含标题的名称,所以我正在寻找解决“偏移”问题的解决方案。

PS:有些行是偏移的,有些不是。偏移量可以是 1、2 或更多单元格,所以我不能这样做: value(i+1) = i 因为没有逻辑

在此处下载文件,或在此处下载相同的信息:

FRAME           BRAKES         SADDLE         WHEELS          etc….
brakes: info1   saddle:info1   wheels:info1     
frame:info2     brakes:info2   saddle:info2   wheels: info2 
brakes: info3   saddle:info3   wheels:info3     

我不知道 vlookUp 结合一些正则表达式是否可以解决问题,

你有什么建议?

编辑:在此处下载文件

VBA 代码

Option Explicit

Sub test()
Dim Titles As Variant
Dim Data As Variant
Dim Dataline As String
Dim NumDataPoints As Long
Dim FirstTitle As String
Dim WhichTitle As Long
Dim Offset As Long
Dim rowcount As Long

Open "SORTcannodale2013.csv" For Input As #1

Line Input #1, Dataline

Titles = Split(Dataline, ",")
For Offset = 0 To UBound(Titles)
    Cells(1, Offset + 1) = Titles(Offset)
Next

rowcount = 2
'While Not EOF(1)
    Line Input #1, Dataline
    Data = Split(Dataline, Chr$(34) & "," & Chr$(34))

    FirstTitle = LCase(Left(Data(0), InStr(Data(0), vbLf) - 1))
    For WhichTitle = 0 To UBound(Titles)
        If Titles(WhichTitle) = FirstTitle Then Exit For
    Next
    For Offset = WhichTitle To UBound(Titles)
        Cells(rowcount, Offset + 1) = Data(Offset - WhichTitle)
    Next
    rowcount = rowcount + 1
'Wend

Close #1

End Sub
4

2 回答 2

1

我能想到的最快方法是读取 CSV 文件,然后自己将其写到电子表格中。

我阅读了第一行以获得标题。

然后我阅读了第二行,并检查了第一条数据。然后我将其与标题进行比较以获得我的偏移量。

然后我使用我拥有的偏移量写出数据

遍历文件直到我到达最后,然后退出。

这将始终开始在当前工作表上的 A1 中写入。我会把它作为一个练习让它在其他地方写

Option Explicit

Sub test()
Dim Titles As Variant
Dim Data As Variant
Dim Dataline As String
Dim NumDataPoints As Long
Dim FirstTitle As String
Dim WhichTitle As Long
Dim Offset As Long
Dim rowcount As Long

Open "test.csv" For Input As #1

Line Input #1, Dataline
Titles = Split(Dataline, ",")
For Offset = 0 To UBound(Titles)
    Cells(1, Offset + 1) = Titles(Offset)
Next

rowcount = 2
While Not EOF(1)
    Line Input #1, Dataline
    Data = Split(Dataline, ",")
    FirstTitle = UCase(Left(Data(0), InStr(Data(0), ":") - 1))
    For WhichTitle = 0 To UBound(Titles)
        If Titles(WhichTitle) = FirstTitle Then Exit For
    Next
    For Offset = WhichTitle To UBound(Titles)
        Cells(rowcount, Offset + 1) = Data(Offset - WhichTitle)
    Next
    rowcount = rowcount + 1
Wend

Close #1

End Sub
于 2012-10-25T19:38:39.010 回答
0

没有真正的理由在这里编写自己的 CSV 导入函数。上传到 DropBox 的文件具有用双引号括起来的字段,并且字段中的任何双引号都正确加倍。

将文件导入 Excel 非常简单:

Workbooks.OpenText Filename:="SORTcannodale2013.csv", _
    DataType:=xlDelimited, TextQualifier:=xlTextQualifierDoubleQuote, _
    ConsecutiveDelimiter:=True, Comma:=True

标题行实际上并不包含所有可能值的条目。例如,“Rear Shock”和“Extras”在测试数据中,但未显示在标题行中。您应该识别所有可能的值并构建自己的包含所有这些值的标题行。

在每个数据条目中,我们有字段名称,然后是嵌入的换行符(ASCII 字符 10),然后是数据值。将条目拆分为字段名称和值只需要Split像以前一样使用函数作为Chr$(10)分隔符。

将数据转换为可用的工作表可以通过简单地硬编码每个字段名称(例如在Dictionary对象中)的列号、从每个条目中拆分字段名称、在字典中查找适当的列号并输出数据值来完成到相应的单元格。

如果您将持续需要处理这些数据,那么花时间将其转换为更标准化的格式(例如 XML)可能是值得的。数据中没有任何内容特别适合在 Excel 中处理。要将其转换为 XML,您需要做更多的工作来转义数据中的某些字符。如果您随后需要使用 Excel,那么导入 XML 数据就很容易了

于 2012-10-27T02:19:23.037 回答