2013-02-14 35 views
4

我有下面類似於某個應用程序輸出的大約5k +字符串的數組(出於安全原因,我可能無法提供確切的數據,但示例格式非常類似於實際數據):將字符串拆分爲具有特定模式和條件的部分

kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad 
asdfasdf66sdafsdfsdf4560sdfasdfasdf 
sdfaasdfs96sadfasdf65459asdfasdf 
sadfasdf8asdfasdas06666654asdfasdfsd 
fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf 

簡單地說,我有由5份非間斷的字母數字字符串:

[latin letters][1 or more digits][latin letters][1 or more digits][latin letters] 

的字母部分長度,以及數字量是隨機的,整體ST環長度可以從幾個到2-3 數百的字符,但是模式仍然如上。

實際上我感興趣的開頭和結尾的字符串件,即[1 or more digits][latin letters][1 or more digits]可能只是隨意丟棄,而另外2個字符串應該被提取分離細胞。

我試過SUBSTITUTESEARCH功能,但我仍然可能不處理隨機數字的數字。 VBA是最後期望的方法,但是如果純粹的公式無用,則是可以接受的。此外,解決方案應該靈活,以便將來可能使用類似的模式 - 所以任何正確的指導/一般方法將不勝感激。

+0

也許這將設置你在正確的軌道上:office.microsoft.com:從字母數字串中提取號碼(HTTP://辦公室。 microsoft.com/en-us/excel-help/extracting-numbers-from-alphanumeric-strings-HA001154901.aspx) – Tim 2013-02-14 17:37:11

+0

@Tim感謝您的建議,請等待可能的答案時嘗試。 – Ksenia 2013-02-14 17:42:33

回答

3

例程使用通配符。假設數據可以在Word中打開,請執行以下操作:

  1. 按CTRL + H^替換對話框打開。
  2. 勾選Use wildcards選項。
  3. 您要丟棄的部分數據與以下模式匹配:[0-9]{1,}*[0-9]{1,} - 表示任何數字與任何字符之間的1次或更多次。根據您的區域設置,您需要;而不是,
  4. 指定一個你喜歡的字符,例如^t(Tab)或; - 用於進一步拆分零件。
  5. 執行更換。
  6. (可選)您可以使用功能區Insert > Table > Convert Text to Table...功能將其餘轉換爲表格。

現在您只需要保存/粘貼獲得的結果。

實際上,這種方法非常強大,許多類似於你的例行文本數據解析任務可能會很快完成,無需特殊技能和/或編程。而且你不需要任何第三方工具 - 現在每臺PC都安裝了Word。

瞭解更多關於模式和適用例:

+0

該死的,但這是+1的棘手方法和簡單性))) – 2013-02-14 18:06:51

+0

@PeterL。謝謝!我使用這個例程來處理大量的數據數組,特別是對於一次性解決方案。 – 2013-02-14 18:19:55

+0

@MaksGordeev這個建議很棒:簡單,直觀,如果需要可以進行宏編碼。對於類似的1次解決方案來說絕對是必須做的。感謝您的好教程。 – Ksenia 2013-02-14 19:16:44

2

基於this tutorial從大chandoo(誰如果你想成爲真棒在Excel中,應該遵循:

使用這個公式(注意數組公式,你需要進入它ENTER + SHIFT + CTRL)提取

{=MIN(IFERROR(FIND(lstNumbers,G6),""))} 

其中lstNumbers是在與含有0-9(在一個小區中的每個數量的單元片材一個命名的範圍)和E1包含數據的單元格。

這將retur n個第一數 ,然後你可以提取與第一部分:

=LEFT(E1,G1-1) 

其中,e1包含數據和G1前面的公式

獲得數字部分的使用端:

{=MAX(IFERROR(FIND(lstNumbers,E1),""))} 

然後您可以使用mid來提取數值部分並使用len(datacell) - len(從max函數)來提取右邊(或中間)剩下的字符串。我們將使用相同的處理方式 - 獲取第一個分數,最後一個分配最大值等。

祝你好運!還有對於其中涉及內置Search and Replace這樣的任務非常簡單的方法 - 這是一個真正hardone,與真正的編程語言,這樣做會如果你不介意使用微軟Word代替Excel中更容易也許

+0

感謝您的建議,但我想避免任何臨時計算,例如解決方案中的命名區域。儘管如此,對於努力和友好鏈接來說,這是一個公平的讚賞。 – Ksenia 2013-02-14 17:56:52

+0

您也可以在另一個工作表或工作簿中使用命名的區域。無論如何祝你好運 – alonisser 2013-02-14 18:00:03

+0

爲了避免命名區域,用TEXT(行(A1:A10)-1,「0」)替換lstNumbers ....你仍然必須使用矩陣forumla – romar 2013-02-14 18:01:34

2

更新:

這個陣列式會給你第一串部分:

=LEFT(A1,MATCH(0,1*ISERROR(1*MID(A1,ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1) 

此數組公式會給你最後一個字符串部分:

=RIGHT(A1,MATCH(0,1*ISERROR(1*MID(A1,LEN(A1)+1-ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1) 
+0

感謝您的另一個不錯的選擇! – Ksenia 2013-02-14 19:17:33