檔案資料去重示例

2021-10-10 16:25:20 字數 4359 閱讀 6202

【摘要】在資料處理業務中,有時需要清除檔案中的重複資料或只留下重複資料,本文將從小檔案、大檔案兩方面介紹整行去重、關鍵列去重的幾種處理辦法,並提供用 esproc spl 編寫的**示例。esproc 是專業的資料計算引擎,spl 中有一套完善的集合運算領域的函式庫,很適合處理檔案去重,寫出的**非常簡潔。

有乙個文字檔案,其每一行是乙個字串,要將檔案中的重複行只保留一行。處理此問題可以把檔案的每一行讀成乙個字串,組成乙個集合,然後通過集合去重運算得出結果。

示例:報名繪畫興趣班的同學學號姓名記錄在paint.txt中,可能有些同學報了多次,請刪除檔案中重複的報名後儲存在paint1.txt中。原檔案部分資料如下所示

20121102-joan

20121107-jack

20121113-mike

20121107-jack

esproc spl指令碼如下:

a注釋

1=file("e:/txt/paint.txt").read@n()

讀出paint.txt的每一行組成集合

2=a1.id()

刪除a1集合中重複的成員

3=file("e:/txt/paint1.txt").write(a2)

將刪除重複行後的a2寫入檔案paint1.txt中

乙個檔案,有多列資料,第一行是列名,第二行開始是資料記錄,要對檔案中關鍵列的內容進行比較,對關鍵列內容重複的行進行刪除或只保留重複的行。

現有2023年的銷售訂單表order_2018.xlsx,部分資料如下所示:

示例1:請求出2023年購買產品的所有不同的客戶id,儲存在檔案2018c.xlsx中。

esproc spl指令碼如下:

a注釋

1=file("e:/txt/order_2018.xlsx").xlsimport@t()

讀出2018訂單表資料

2=a1.id(customerid)

取出所有不重複的客戶 id

3=file("e:/txt/2018c.xlsx").xl***port(a2)

將客戶id儲存到檔案2018c.xlsx

示例2:請求出2023年各位客戶購買了哪些不同產品,將customerid和productid儲存在檔案2018c_p.xlsx中。

esproc spl指令碼如下:

a注釋

1=file("e:/txt/order_2018.xlsx").xlsimport@t(customerid,productid)

讀出2018訂單表關鍵列資料

2=a1.group@1(customerid,productid)

按關鍵列分組,@1表示只取分組中的一條記錄

3=file("e:/txt/2018c_p.xlsx").xl***port@t(a2)

將結果a2儲存到檔案2018c_p.xlsx

示例:請求出2023年回頭客(即多次購買同種產品的客戶)的訂單情況,將結果儲存在檔案2018c_rebuy.xlsx中。

esproc spl指令碼如下:

a注釋

1=file("e:/txt/order_2018.xlsx").xlsimport@t()

讀出2018訂單表資料

2=a1.group(customerid,productid)

同一客戶購買同種產品的訂單分為一組

3=a2.select(~.count()>1).conj()

選出訂單數大於1的組,把各組的訂單並集為乙個資料表

4=file("e:/txt/2018c_rebuy.xlsx").xl***port@t(a3)

將結果a3儲存到檔案2018c_rebuy.xlsx

大檔案資料不能一次性全部裝進記憶體,不能象小檔案資料那樣全部讀出來再進行重複性比較,需要分批讀出資料去比較。esproc spl提供了游標來處理大檔案運算,使大檔案去重運算也變得十分方便。

有大文字檔案,其每一行是乙個字串,要將檔案中的重複行只保留一行。處理此問題要把檔案的每一行讀成乙個字串,成為游標中的一條記錄,然後通過游標的去重運算得出結果。

示例:現有全國房產產權人員登記表大檔案all.txt,裡面記錄產權人的身份證及姓名,部分資料如下所示:

510121198802213364-joan

110113199203259852-jack

201264197206271113-mike

由於有些人員在多個州擁有房產,所以檔案中會有重複的登記,請將重複的登記只保留乙個,將結果儲存在all2.txt中。esproc spl指令碼如下:

a注釋

1=file("e:/txt/all.txt").cursor@s()

建立游標,@s表示用整行構成單字段串的序表

2=a1.groupx(_1)

對游標中的單字段分組,就可去掉重複的行

3=file("e:/txt/all2.txt").export(a2)

將去重後的結果寫入檔案all2.txt中

本節仍用銷售訂單表為例,是所有年份的合併銷售訂單表orders.xlsx,是個大檔案。

示例1:請找出購買產品的所有不同的客戶id,儲存在檔案customers.xlsx中。

esproc spl指令碼如下:

a注釋

1=file("e:/txt/orders.xlsx").xlsimport@tc()

建立訂單表資料游標

2=a1.groupx(customerid)

按customerid分組即得到不重複的客戶id

3=file("e:/txt/customers.xlsx").xl***port@t(a2)

將客戶id儲存到檔案customers.xlsx

示例2:請找出各位客戶購買了哪些不同產品,將customerid和productid儲存在檔案c_p.xlsx中。

esproc spl指令碼如下:

a注釋

1=file("e:/txt/orders.xlsx").xlsimport@tc()

建立訂單表資料游標

2=a1.groupx(customerid,productid)

按關鍵列分組,即可取得不重複的客戶id和產品id

3=file("e:/txt/c_p.xlsx").xl***port@t(a2)

將結果a2儲存到檔案c_p.xlsx

示例:請找出回頭客(即多次購買同種產品的客戶)的訂單情況,將結果儲存在檔案c_rebuy.xlsx中。

esproc spl指令碼如下:

a注釋

1=file("e:/txt/orders.xlsx").xlsimport@tc().sortx(customerid,productid)

建立訂單表資料游標,並按關鍵列排序

2=a1.group(customerid,productid)

同一客戶購買同種產品的訂單分為一組

3=a2.select(~.count()>1).conj()

選出訂單數大於1的組,把各組的訂單並集為乙個資料表

4=file("e:/txt/c_rebuy.xlsx").xl***port@t(a3)

將結果a3儲存到檔案c_rebuy.xlsx

《spl cookbook》中還有更多相關計算示例。

linux 檔案去重

兩個檔案的交集,並集 前提條件 每個檔案中不得有重複行 1.取出兩個檔案的並集 重複的行只保留乙份 cat file1 file2 sort uniq file3 2.取出兩個檔案的交集 只留下同時存在於兩個檔案中的檔案 cat file1 file2 sort uniq d file3 3.刪除交...

hive 列表去重 Hive 資料去重

實現資料去重有兩種方式 distinct 和 group by 1.distinct消除重複行 distinct支援單列 多列的去重方式。單列去重的方式簡明易懂,即相同值只保留1個。多列的去重則是根據指定的去重的列資訊來進行,即只有所有指定的列資訊都相同,才會被認為是重複的資訊。1 作用於單列 se...

Lamada List 去重及其它操作示例

import j a.util.concurrent.concurrenthashmap import j a.util.function.function import j a.util.function.predicate import j a.util.stream.collectors pr...