= temp;
}
}
}
---------------------------2----------------------------------
C#实现大数据量TXT文本数据快速高效去重
[日期:2012-11-09] 作者:blue1000 来源:BK网络学院 [字体:大 中 小]
对几千万的TXT文本数据进行去重处理,查找其中重复的数据,并移除。尝试了各种方法,下属方法是目前尝试到最快的方法。以下代码将重复和不重复数据进行分文件存放,提升效率的关键是用到了HashSet。
TextReader reader = File.OpenText(m_dataFilePath);
string[] files = new string[2];
files[0] = ROOT_DIR + "不重复数据.txt";
files[1] = ROOT_DIR + "重复数据.txt";
TextWriter writer1 = File.CreateText(files[0]);
TextWriter writer2 = File.CreateText(files[1]);
string currentLine;
int idx = 0;
HashSet<string> previousLines = new HashSet<string>(new MyEqualityComparer());
while ((currentLine = reader.ReadLine()) != null)
{
if ((++idx % 10000) == 0)
UpdateInfo("正在比对第 " + idx + " 条数据…");
currentLine = currentLine.TrimEnd();
if (previousLines.Add(currentLine))
{
writer1.WriteLine(currentLine);
}
else
{
if(m_allSave)
writer2.WriteLine(currentLine);
}
}
reader.Close();
writer1.Close();
writer2.Close();
reader.Dispose();
writer1.Dispose();
writer2.Dispose();
1000万数据的处理时间也就是转瞬之间,试试看?
------------------------------------------------------------------
声明,这是转载, 来自 http://www.blue1000.com/bkhtml/2012-11/70985.htm
--------------------------------------------------------------
第二个很简单吧,只要把这个代码翻译成ps代码即可。这个翻译看看抽空我能做不
下一步就是测试了,你都熟悉啥语言,啥工具呢?
你能帮忙测试么?
或者把你的文本压缩包,传上来。让某个帖子看官测试。
作者: ShadowFiend 时间: 2013-7-6 16:20
回复 2# PowerShell
楼主想用PS代码实现啊,把代码写下来~
作者: Demon 时间: 2013-7-6 17:57
行去重么?
powershell的默认把,数据分成行,然后存在数组中,适合小文件。也就是说性能很差。但是功能很 ...
PowerShell 发表于 2013-7-6 10:54
传教士大人你昨天不是说无敌的PowerShell不需要算法的么,不是应该调用某个类就能轻松解决的么?
作者: PowerShell 时间: 2013-7-6 18:14
算法,应该是冒泡,二叉遍历之类的.算法,要涉及到底层的数据结构,
所以应该是方法,更确切些,方法是指调用哪些类库,已经更正.
吹毛球p的家伙啊,我要用一个p把你蹦飞~~~
作者: CrLf 时间: 2013-7-6 18:54
gnu 的第三方还是很爽的:复制代码
复制代码
sed用在这里效率应该比较低,就不举例了。
另,
hash.add效率高但是受内存分配限制不能处理G级数据
无语,ms 也太懒了,我所了解的三种 hash 算法都无此限制,因为它们都是逐字节或逐段计算的。不了解 c#,不作过多评论。
作者: Demon 时间: 2013-7-7 18:34
gnu 的第三方还是很爽的:sed用在这里效率应该比较低,就不举例了。
另,
无语,ms 也太懒了,我所了解 ...
CrLf 发表于 2013-7-6 18:54
你把哈希表跟哈希算法搞混了吧。
作者: awk 时间: 2013-7-7 18:39
回复 2# PowerShell
看不懂C#,也不想学,因为我的工作中根本用不到。
文件太大了,十几个GB,不好传啊。
版主能否先给个针对小文件的PowerShell去重代码?我先学习一下。
作者: awk 时间: 2013-7-7 18:42
回复 5# PowerShell
我记得冒泡,二叉遍历之类的好像是用来排序的吧,以前学校里面学过,现在都忘了。
如果说错了请大家指正。
去重之前必须要排序吗?好复杂的说。
作者: CrLf 时间: 2013-7-7 21:42
回复 7# Demon
不甚明了,求指点
作者: Demon 时间: 2013-7-7 22:21
回复 Demon
不甚明了,求指点
CrLf 发表于 2013-7-7 21:42
http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/List_of_hash_functions
http://en.wikipedia.org/wiki/Hash_table
一个是算法,一个是基于此类算法的数据结构。
作者: PowerShell 时间: 2013-7-7 22:28
谁最好给个测试用的数据,的压缩包的,下载地址啊。最好是长期的。
作者: batman 时间: 2013-7-8 09:42
这传的是哪门子教?口水教。。。
作者: awk 时间: 2013-7-8 19:59
回复 12# PowerShell
我在顶楼放了点数据
作者: awk 时间: 2013-7-12 19:44
回复 12# PowerShell
版主最近忙什么呢?数据放在顶楼好几天了,求代码啊。
作者: Batcher 时间: 2013-7-30 13:58
- get-content a.txt | sort -unique
复制代码
- get-content a.txt | sort | get-unique
复制代码
作者: luke 时间: 2013-9-4 00:08
$hashset=New-Object System.Collections.Generic.HashSet[int]
$duplicateFile="d:\1\duplicate.log"
$uniqueFile="d:\1\unique.log"
$sourceFile="D:\1\u_ex13061100.log"
Get-Content $sourceFile | %{
if($hashset.add($_.GetHashCode())){
$_ | Out-File -FilePath $uniqueFile -Append
}else {
$_ | Out-File -FilePath $duplicateFile -Append
}
}
作者: awk 时间: 2013-9-5 14:14
回复 17# luke
正解。感谢!
作者: PowerShell 时间: 2013-9-5 21:34
17楼的代码显然不行,实验后更不行。
1 貌似不应该用Get-Content。我想,或许,应该用streamreader。
2 貌似不应该用out-file -append。我想,或许,应该用stringbuilder
3 绝对不应该用string.gethashcode() 。具体原因参见 http://msdn.microsoft.com/zh-cn/ ... ng.gethashcode.aspx
说明
如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。 但是,每个唯一的字符串值并没有唯一的哈希代码值。 不同的字符串可以返回相同的哈希代码。
有关哈希代码的更多信息,请参见 Object.GetHashCode。
对调用者的说明
GetHashCode 返回的值与平台相关。 在 32 位和 64 位版本的 .NET Framework 上有所不同。
这个问题比较难,或者说我水平太差。等我有空研究下。或者坐等牛人。
顾请楼主把标题改成未解决。
作者: luke 时间: 2013-9-9 11:15
版主说的不错,不同的字符串可能会产生相同的哈希值,这个要得看需求了,可以改用md5算法。
作者: terse 时间: 2013-9-9 14:39
- $AFile = "c:\test\a.txt"
- $DFile = "c:\test\add.txt"
- $Hash = @{}
- Get-Content $AFile | %{
- if(!$Hash.ContainsKey($_)){
- $_
- $Hash.Add($_ , 1)
- }
- } | Out-File $DFile
-
- $Hash.Keys
-
- CMD /C "PAUSE"
复制代码
作者: softy 时间: 2013-10-6 17:25
$spath="f:\Code\powershell\重复行.txt"
$dpath="f:\Code\powershell\去重复行.txt"
[System.Collections.Generic.HashSet[string]]$lines=Get-Content $spath -ReadCount 0
Set-Content -Path $dpath -Value ($lines -join "`r`n")
以前写的,代码很简单,速度也不错,文件大时比较耗内存而已,可能需要3.0以上版本,2.0版的估计要修改下代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |