2014-12-26 132 views
0

我有一個包含9列(「|」作爲分隔符)的呼叫詳細記錄(CDR)的大文件(3 * 10^7行)。每行是具有以下屬性的通信實例:用戶拆分大文件

Date|Time|Duration|Caller|Receiver|serviceType|junk|cellReceiver|cellCaller|CallerLAC 

我需要根據用戶將此文件拆分爲更小的塊。因此,無論用戶是呼叫者還是接收者(即,如果A稱爲B,則該行應該出現在兩個文件中,即用戶A的文件和用戶B的文件中),每個文件將是用戶的全部通信。

什麼是最有效的方法? (我正在使用OS X Yosemite)。

+0

任何特定的語言/平臺? – Anonymous

+0

最好使用終端(在MAC上)或Python。我將編輯問題以包含此內容。 – amaatouq

+0

系統上簡單的解決方案有多慢,即使用csv模塊迭代文件。將遇到的每行添加到兩個文件(cdr_user_A.txt&cdr_user_B.txt) –

回答

2

bash和awk - 我知道你在標題中詢問python。除非這是作業shell才能滿足。

awk -F '|' {u1=$4 
      u2=$5 
      arr[u1]=arr[u1] $0 "\n" 
      if(u2==u1) continue; 
      arr[u2]=arr[u2] $0 "\n" 
      } 
      END { 
       for (i in arr) {fname=i 
           print arr[i] > fname 
           close(fname) 
           } 
      } ' inputfile 

一些命名變量被用來使其更具可讀性。您的數據有可能在所有輸出文件中共生成超過3000萬行。我同意數據庫的建議。一定要檢查允許的內存ulimit,這將使用很多。請記住在文件系統上觀看文件inode限制。

1

它絕對必須是單獨的文件嗎?因爲你沒有用特定語言標記: 就我個人而言,我會將它作爲管道分隔符('|')ASCII(假設ASCII爲未指定的問題)導入到SQL數據庫中。
優點:

  1. 解析是不是你的問題
  2. 可以輸出你想要的東西
  3. 查詢你想要
  4. 複雜的查詢是可能的任何數據,而無需編寫代碼比簡單更復雜SQL SELECT陳述
  5. 支持跨幾乎任何數據庫或平臺的方法
+0

不幸的是,它絕對必須是單獨的文件(已有的就地系統需要每個用戶有一個文件)。 – amaatouq

+1

啊,那麼取消那個想法吧! (但是,如果其他人有類似的問題,請留下答案) – frasnian