Regex EXCEL/VBA:列标题和值是偏移的,如何使它们同步

Regex EXCEL/VBA:列标题和值是偏移的,如何使它们同步,regex,excel,vba,vlookup,Regex,Excel,Vba,Vlookup,我使用的是一个输出文件(CSV),它来自一个外部源,用于进行数据刮取 然而,“废弃”的网页没有相同的精确模式,所以在输出文件(Excel)中,我有一列是偏移的。第四,这些值包含头的名称,因此我正在寻找解决“偏移”问题的解决方案 PS:有些行是偏移的,有些不是。偏移量可以是1个、2个或更多的单元格,因此我无法执行:value(i+1)=i,因为没有逻辑 在此处下载文件或相同信息: FRAME BRAKES SADDLE WHEELS

我使用的是一个输出文件(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和一些regex能不能做到

你有什么建议

编辑: 下载文件

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

我能想到的最快的方法就是读入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

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

将文件放入Excel非常简单,如下所示:

Workbooks.OpenText Filename:="SORTcannodale2013.csv", _
    DataType:=xlDelimited, TextQualifier:=xlTextQualifierDoubleQuote, _
    ConsecutiveDelimiter:=True, Comma:=True
标题行实际上没有所有可能值的条目。例如,“后冲击”和“附加”在测试数据中,但不在标题行中表示。您应该识别所有可能的值,并构造自己的包含所有这些值的标题行

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

将数据转换为可用的工作表只需对每个字段名的列号进行硬编码(例如,在
字典
对象中),从每个条目中拆分字段名,在字典中查找适当的列号,并将数据值输出到适当的单元格即可


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

您是在创建CSV文件,还是来自其他数据源?不幸的是,来自其他数据源。偏移量不是线性的,因为某些行中缺少一些值。因此,偏移量可以在开始时为1,但是在行的中间可以是2,计算偏移将不起作用,我们可以用来连接单元格到它的“好位置”的数据是用ReXEXTED,因为你有所有的数据在<代码>数据()/代码>数组中,你可以用<代码> UCASE提取标题(左)(数据(X),ISTR(数据)(X),“:”)-1))函数,然后使用该函数决定将itI放置在何处我尝试了它,但遇到了一个问题。我的csv格式为“header”、“header2”\n“header:value”、“header:value2”" .... 所以当我用逗号分开的时候。。。它找不到匹配项…而且单元格值可能包含逗号,因此按逗号拆分不会执行此操作。如果所有值都被引用,按“拆分,然后每隔一个值读取一次(可怕的hack)