Excel 字符串拆分


用 Excel 處理數據時,有時需要對字符串進行拆分。對於比較簡單的拆分,使用 Excel 函數可以順利完成,但碰到一些特殊需求,或者拆分的規則比較復雜時,則很難用 Excel 實現了。這里列出一些拆分需求示例,分析拆分難點,並提供 SPL 解決代碼。SPL 是專業計算引擎 esProc 使用的語言,用於處理結構化數據運算非常方便,對於字符串拆分的運算也很簡單。

一、規則單詞拆分

這里有一份車間采購產品清單,清單的每一項包含了需要采購的品牌以及產品型號。現在想要把每一項的品牌以及型號拆分后單獨列到后面。

文件 productlist.xlsx 中數據如下:

..

 

期望結果:

..

使用 Excel 來處理這類拆分時,可以使用數據的分列,但是分列有個缺點,其實也算不上缺點,只是針對這個只想拆出品牌的需求來說單詞被過渡拆分了。比如后面的型號,也會被拆分到多個列,又需要重新合並,過程有點得不償失。不過 Excel 還有一個快速填充,可以根據給定的參考值,比如第一行給定 PANASONIC,便可使用類似規則快速填充后面行的拆分,然后再用 Mid 函數間接算出型號的字符串部分,過程依然繁瑣。

使用 SPL 可以直接讀取 Excel 文件,對於實時分析操作,也可以將 Excel 中的數據復制到剪貼板,然后在 SPL 里面使用 clipboard 函數直接從剪貼板獲取數據,數據整理完后,再將結果放入剪貼板,然后在 Excel 中粘貼結果,這樣便可將 Excel 的分析操作跟 SPL 的計算無縫對接起來,方便而又高效。

SPL 拆分代碼:

  A B
1 =clipboard().import@i() /從剪貼板導入產品清單
2 =A1.(~.split@1(" ")) /從第一個空格處將產品清單分離為兩部分,產生一個序列的序列
3 =A2.concat@n("\t") /拼接為子序列的成員用 Tab 分隔,序列的成員之間用回車分隔的二維表串
4 =clipboard(A3) /將串值放置到剪貼板

代碼執行完成后,只需在B1 格粘貼便可得到期望結果。

二、數字分離

如下為一些數字跟字符混合在一起的數據,現在需要將數字和字符分離開。

文件 numbers.xlsx 中數據如下:

 

..

期望結果:

..

如果是光分離數字出來,仍然可以使用給定首行參考值,然后采用快速填充,便可以將所有數字分離出來。但是要將剩余的字符再分離出來,Excel 沒有合適的辦法,因為有些數字是跟字符交叉混合在一起,沒法用 Mid 等函數拆分。只能采用 VBA 寫代碼逐字循環,判斷字符類型,挨個分離,過程依然麻煩。

SPL 可以直接將串分離成單字符,並根據類型划分:

  A B
1 =clipboard().split@n() /將剪貼板數據按回車拆分為成員,然后將成員再逐字拆分
2 =A1.(~.align@a([true,false],isdigit(~)).(~.concat())) /每一項字符序列用是否為數字分成兩組,繼而再拼成串,從而分離出數字和字符
3 =A2.concat@n("\t") /將兩層序列分別用 Tab 和回車拼為二維表式的大串
4 =clipboard(A3) /將大串放置到剪貼板

 

三、日期分離

下面為一些包含日期的句子或段落,現在想要把句子里面所有的日期分離出來,一行中包含多個日期時,用分號分開。

文件 multidates.xlsx 中數據如下:

..

期望結果:

..

要將句子里面的日期分離出來,Excel 沒有相應的辦法,尤其像這種一個句子里面有不定個數的日期。如果是固定位置或長度的日期格式,才可能用截取固定長度,或者使用快速填充能夠辦到。對於上述多個日期的分離,只能寫 VBA 代碼,再用正則表達式去匹配解析,完成這種需求對人員要求較高,且實現過程繁瑣。

SPL 直接用空格分割串為單詞序列,然后按格式轉換日期類型的數據:

  A B
1 =clipboard().split@n(“ “) /將剪貼板數據按回車拆分成員,然后用空格將每一成員拆分為單詞序列
2 =A1.(~. (date(~,"dd.MM.yy"))) /將單詞序列的成員按照指定格式轉換為日期類型的數據
3 =A2.(~.select(ifdate(~))) /選出序列中的日期類型的值
4 =clipboard(A3.concat@n(“;”)) /將日期串序列結果拼接為二維表串並放置到剪貼板

執行完上述代碼后,直接在源表中的B1 格執行粘貼,即可得到期望結果。

四、按字符拆分

如下表為一列長度不等的數字,現在需要將數字逐字拆分成為單獨的列。

文件 number.xlsx 的數據:

..

期望結果:

..

使用 Excel 拆分上述數字時,首先想到的是使用分列,但是像這種逐字拆分,分列時只能一個一個指定分隔位,數字比較長時就要多次重復設置,操作多而麻煩。其次是使用函數,比如可以在 B1 寫入 =MID($A1,COLUMN(A1),1),然后拖拽鼠標進行行填充以及列填充,但這種操作不好掌握最大列數,篇幅大時,操作也不方便。

SPL 可以直接按字符拆分:

  A B
1 =clipboard().split@n() /將剪貼板數據按回車拆分成員,然后每個成員再缺省拆分為單字符序列
2 =A1.concat@n("\t") /將拆分后的兩層序列拼成串式二維表
3 =clipboard(A2) /將結果放置到剪貼板

上述代碼執行完成后,同樣在 B1 處粘貼拆分后的數據即可。

五、屬性表和文件名拆分

如下數據為一段日志描述文件,結構相對復雜,其中包含類似於屬性表的分節描述。現在想將屬性描述中的 PublicKeyToken 以及文件名分離出來。

文件 log.xlsx 的數據:

..

期望結果:

..

這是一個綜合串的分離,第一層為用逗號分隔的描述串,然后第二項類似於屬性分節串的描述。所以使用 Excel 時,需要多次分列,以及多次快速填充,方可完成期望結果。同樣是步驟多,且需要給定參考值來快速填充,過程繁瑣。

SPL 提供了函數直接對屬性串取值,以及對文件名的不同部分拆分:

  A B
1 =clipboard().split@nc() /將剪貼板數據用回車拆分成員,然后以逗號拆分子成員序列
2 =A1.([replace(~(2),"\"","").property("PublicKeyToken"),filename(replace(~(3),"\"",""))]) /去掉兩端引號后,用屬性 property 函數從第 2 項獲取 PublicKeyToken 的值;再用 filename 函數拆分出第 3 項中的文件名;再將這兩個值構成序列
3 =clipboard(A2.concat@n("\t")) /將結果拼為大串放置到剪貼板

 

SPL Cookbook》中有更多相關計算示例。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM