2016-06-10 95 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

相關問題