我有一个大文件(3 * 10 ^ 7行)的呼叫详细记录(CDR),有9列(" |"作为分隔符)。每行都是具有以下属性的通信实例:
Date|Time|Duration|Caller|Receiver|serviceType|junk|cellReceiver|cellCaller|CallerLAC
我需要根据用户将此文件拆分为较小的块。因此,无论用户是呼叫者还是接收者,每个文件都将是用户的所有通信(即,如果A称为B,则该行应出现在两个文件中,即用户A的文件和用户B的文件)。
最有效的方法是什么? (我正在使用OS X Yosemite)。
答案 0 :(得分:2)
bash和awk - 我知道你在标题中要求python。除非这是家庭作业,否则就足够了。
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 :(得分:1)
它绝对必须是单独的文件吗?
由于您没有使用特定语言标记:
就个人而言,我将它作为管道分隔(' |')ASCII导入到SQL数据库中(假设ASCII未指明,则为ASCII)。
优点:
SELECT
语句更复杂的代码