嘿,各位,你们这里的社区很棒。我是一名电气工程师,在一边做一些“编程”工作,以帮助支付账单。我这么说是因为我希望你们考虑到我没有受过适当的计算机科学培训,但我在过去的7年里一直在编码。
我有几个excel表的信息(都是数字的),基本上它是“拨号电话号码”在一列和每一个号码的分钟数在另一列。另外,我有一个“运营商前缀号码”的列表,供我国不同的运营商使用。我想做的是把每个承运人的所有“流量”分开。下面是一个场景:
第一次拨号码行:123456789ABCD,100 <--这将是一个13位数的电话号码和100分钟。
我有一张用于载波1的12,000+前缀码的列表,这些码的长度各不相同,我需要检查每个人:
前缀代码1:1234567 <--这段代码长7位。
我需要检查前7位号码的拨号号码,比较它与拨号号码,如果找到匹配,我会把分钟数加到一个小计供以后使用。请考虑并非所有前缀码都是相同的长度,有时它们更短或更长。
这大部分应该是小菜一碟,我本可以做到的,但我对海量的数据感到有点害怕;有时,拨号号码列表包含多达3万个号码,“载波前缀码”列表大约有1.3万行长,我通常会检查3家运营商,这意味着我必须做很多“匹配”。
有没有人知道如何使用C#有效地完成这一任务?或者任何其他的语言,诚实地说。我需要经常这样做,为此设计一个工具就更有意义了。我需要一个有“计算机科学家”背景的人的好视角。
列表不需要在excel工作表中,我可以导出到csv文件并从那里工作,我不需要一个“interface”接口。
谢谢你的帮助。
更新:
谢谢大家花时间回答我的问题。我想由于我的无知,我夸大了“效率”这个词。我不是每隔几秒钟就做一次这个任务。这是我每天必须做一次的事情,我讨厌使用Excel和VLOOKUP等等。
我从你们那里学到了新的概念,我希望我能用你们的想法建立一个解决方案。
发布于 2009-06-25 21:13:21
在我看来,你需要从运营商的前缀构建一个trie。您将得到一个trie,其中终止节点告诉您该前缀的载波。
然后创建一个从载体到int或long (总计)的字典。
然后,对于每一个拨号号码行,只要你的工作方式下trie,直到你找到承运人。找到承运人到目前为止的总分钟数,并添加当前行-然后继续。
发布于 2009-06-25 21:41:04
实现这一目标的最简单的数据结构是一组集合。为每个载体设置一个包含所有前缀的集合。
现在,要将呼叫与运营商联系起来:
foreach (Carrier carrier in carriers)
{
bool found = false;
for (int length = 1; length <= 7; length++)
{
int prefix = ExtractDigits(callNumber, length);
if (carrier.Prefixes.Contains(prefix))
{
carrier.Calls.Add(callNumber);
found = true;
break;
}
}
if (found)
break;
}如果您有10个运营商,将有70个查询在每一次通话。但是,在集合中查找并不太慢(比线性搜索快得多)。因此,这应该会给你一个相当大的速度超过一个蛮力线性搜索。
您可以更进一步,根据长度对每个载波的前缀进行分组。这样的话,如果一个载体只有长度7和4的前缀,你就会知道只需要提取和查找这些长度,每次都要查看这个长度的前缀集。
发布于 2009-06-25 22:09:58
如何将数据转储到几个数据库表中,然后使用SQL查询它们呢?简单!
CREATE TABLE dbo.dialled_numbers ( number VARCHAR(100), minutes INT )
CREATE TABLE dbo.prefixes ( prefix VARCHAR(100) )
-- now populate the tables, create indexes etc
-- and then just run your query...
SELECT p.prefix,
SUM(n.minutes) AS total_minutes
FROM dbo.dialled_numbers AS n
INNER JOIN dbo.prefixes AS p
ON n.number LIKE p.prefix + '%'
GROUP BY p.prefix(这是为Server编写的,但是对于任何其他DBMS来说都应该非常简单。)
https://stackoverflow.com/questions/1046278
复制相似问题