根据另一个字符串

时间:2016-06-10 02:11:18

标签: excel parsing excel-formula

我的第一篇帖子...... 有经验的excel,但没有使用字符串搜索/解析...

我有一堆以下形式的字段/单元格:

"formid";s:4:"1001";s:11:"mkto_MRM_ID";s:6:"287227";s:15:"Activity_Name_m";s:59:"ca erwin data modeler community edition evaluation software";s:13:"CSU_Driver__c";s:0:""

格式为 - 标签,即将到来的字符串的长度,字符串 - 因此,标签为'formid'即将到来的字段的长度为4,值为'1001'

标签和值的数量因字段而异

我想要的是解析这些数据,从这些数据中找出六个标签/值对,并将值粘贴在电子表格的单独单元格中。

有很多分隔符,但我认为最简单的方法 - 如果可行 - 是找到我想要的标签,然后返回下一组引号之间的任何内容。

所以在上面的示例中,我会搜索"mkto_MRM_ID"然后返回接下来两个引号之间的内容 - 在本例中为"287227"

所以我可以在这个数据右侧的一列中分别有六个公式,用每个公式解析数据,查找我感兴趣的半打标签中的一个然后继续返回在接下来的两个报价之间。这可能是什么或变长字符串。

希望明白。

提前致谢。

菲尔

2 个答案:

答案 0 :(得分:0)

好的,我继续使用公式解决了问题。 Example spreadsheet

我将您的文字放在第二张纸上,然后计算所有报价的索引。我忽略了所有的长度,因为我可以从引号中找出它。以下是此部分的示例,其中包含A1中的文本(在列中重复所有条目 - 我在此处显示3列)

=FIND("""", A1) =FIND("""", $A1, B1 + 1)    =FIND("""", $A1, C1 + 1)

然后在sheet1上,我像这样在第一行计算你的标题(这里显示2列)

=MID(Sheet2!$A$1, Sheet2!B1 +1,Sheet2!C1 - Sheet2!B1 - 1) =MID(Sheet2!$A$1,Sheet2!F1 +1, Sheet2!G1 - Sheet2!F1 - 1)

然后在每一行上我像这样计算每个列值。 (在这里显示2列

=MID(Sheet2!A1, Sheet2!D1 +1, Sheet2!E1 - Sheet2!D1 - 1) =MID(Sheet2!A1, Sheet2!H1 +1, Sheet2!I1 - Sheet2!H1 - 1)

可以根据需要阻止和拖动其中的每一行。

我正在试图弄清楚如何向你发送一份表格....

Sheet 2

Sheet 1

完整的电子表格文本第1页第1行

=MID(Sheet2!$A$1, Sheet2!B1 +1,Sheet2!C1 - Sheet2!B1 - 1) 
=MID(Sheet2!$A$1,Sheet2!F1 +1, Sheet2!G1 - Sheet2!F1 - 1) 
=MID(Sheet2!$A$1, Sheet2!J1 +1, Sheet2!K1 - Sheet2!J1 - 1) 
=MID(Sheet2!$A$1, Sheet2!N1 +1, Sheet2!O1 - Sheet2!N1 - 1)

工作表1第2行(对于您拥有的每一行数据,将该工具向下拖动

=MID(Sheet2!A1, Sheet2!D1 +1, Sheet2!E1 - Sheet2!D1 - 1)
=MID(Sheet2!A1, Sheet2!H1 +1, Sheet2!I1 - Sheet2!H1 - 1)
=MID(Sheet2!A1, Sheet2!L1 +1, Sheet2!M1 - Sheet2!L1 - 1)
=MID(Sheet2!A1, Sheet2!P1 +1, Sheet2!Q1 - Sheet2!P1 - 1)

工作表2第1行(对于你拥有的每一行,将这一个向下拖动)

"formid";s:4:"1001";s:11:"mkto_MRM_ID";s:6:"287227";s:15:"Activity_Name_m";s:59:"ca erwin data modeler community edition evaluation software";s:13:"CSU_Driver__c";s:0:""
=FIND("""", A1)
=FIND("""", $A1, B1 + 1)
=FIND("""", $A1, C1 + 1)
=FIND("""", $A1, D1 + 1)
=FIND("""", $A1, E1 + 1)
=FIND("""", $A1, F1 + 1)
=FIND("""", $A1, G1 + 1)
=FIND("""", $A1, H1 + 1)
=FIND("""", $A1, I1 + 1)
=FIND("""", $A1, J1 + 1)
=FIND("""", $A1, K1 + 1)
=FIND("""", $A1, L1 + 1)
=FIND("""", $A1, M1 + 1)
=FIND("""", $A1, N1 + 1)
=FIND("""", $A1, O1 + 1)
=FIND("""", $A1, P1 + 1)

答案 1 :(得分:0)

所以看起来你可能没有你想要的东西,或者我在其他答案中放的东西太复杂了。所以这是VBA的一种方式。您需要做的就是(使用这个确切的代码)将所有数据行放入A列。它会将您的标题和行转换为两列向右。欢呼声。

Sub parseAndBuild()
    Dim i, j, pos As Integer
    Dim val As String
    Dim item As String

    i = 1
    j = 1
    pos = 1

    'Build the headers
    val = Cells(1, 1).value
    Do
        item = getNextItem(pos, val)
        Cells(1, i + 2).value = item
        getNextItem pos, val
        i = i + 1
    Loop While item <> ""

    i = 1
    'build the rows
    Do While Not IsEmpty(Range("A" & i))
        val = Cells(i, 1).value
        j = 1
        pos = 1
        Do
            'ignore first as it is header and lengths
            item = getNextItem(pos, val)

            item = getNextItem(pos, val)
            Cells(i + 1, j + 2).value = item
            j = j + 1

        Loop While item <> ""
        i = i + 1
    Loop
End Sub

Function getNextItem(pos As Integer, val As String)
    Dim pos1, pos2 As Integer

    pos1 = InStr(pos, val, """")
    pos2 = InStr(pos1 + 1, val, """")
    If (pos1 <> 0 And pos2 <> 0) Then
        pos = pos2 + 1
        getNextItem = Mid$(val, pos1 + 1, pos2 - pos1 - 1)
    Else
        getNextItem = ""
    End If
End Function