2016-06-10 111 views
0

我第一次发布... 经历与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"

因此,我可以在这个数据右边的每列中有六打公式,这些数据解析每个公式所寻找的数据,寻找我感兴趣的半打标签之一然后继续返回接下来的两个报价。这可能不是一个可变长度的字符串。

希望这是明确的。

在此先感谢。

菲尔

+0

请使用正确的格式。你的细胞/领域的内容不清楚要理解。 –

+0

请告诉我们你已经尝试了什么,以及遇到了什么样的问题。 –

+0

所以没有帮助下面的答案?你有反馈意见,如果这对你有用吗?我确实添加了一个链接到我在google文档上创建的示例... – Chewy

回答

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) 

然后在每一行上,我计算每一列的值。 (这里

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

显示2列,每列的这些都可以被阻止,并拖累许多行,因为你需要。

我试图找出如何向您发送表的副本.. ..

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行(箱子拖这一件WN你有每一行)

"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) 
+0

嗨, 我认为上面显示的宏很好,因为它似乎提供了最大的灵活性。 如上所述, \t 看来工作,直到它遇到在即将到来的字符串长度的第一个0值。所以在上面的例子中,如果MRM字符串长度为零,那么它似乎退出评估其余的字段。如果MRM存在,那么它似乎继续并评估其他字符串。实际数据总是与您见上什么开始,但它有更多的字段比出这样的想法是有它通过解析一切即使一些先前场都是空白/长度为0 – Phil

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 
+0

大家好, 感谢您的钟声在这样一个疯狂的日子里,我没有机会回顾每个人的回应。 我的老板找到了一个我们认为正在工作的解决方案,虽然不一定像上面发布的一些东西那么优雅。我现在要利用他已经完成的工作,如果工作很顺利,不然我会回头仔细查看这些数据,并着眼于寻找更全面的解决方案。 坦率我“米×答复的速度和复杂程度感到惊讶。再 感谢, 菲尔斯 – Phil

+0

感谢菲尔,记得要表决的解决方案了,你喜欢,并回答如果我们解决您的问题。这有助于使网站作品。 – Chewy

+0

您好,我想这和它的作品在一定程度上,它似乎工作,直到它遇到在即将到来的字符串长度的第一个0值,所以在上面的例子中,如果MRM的字符串是长度为零,那么它似乎退出评估领域的其余部分。如果MRM存在的话,好像去和评估其他字符串。 实际数据总是与您见上什么开始,但它有更多的字段比出这样的想法是有它解析通过一切,即使有一些前面的字段e空白(长度为零)。但是,当MRM出现时,它确实有效,它确实有效。 – Phil

相关问题