当whitelist.txt VB.NET中存在相同的行时,从主机文件中删除行

当whitelist.txt VB.NET中存在相同的行时,从主机文件中删除行,.net,vb.net,.net,Vb.net,我有两个文本文件hosts file和whitelist.txt 主人 白名单.txt 单击按钮时,必须从主机文件中删除whitelist.txt中的行 ex:x.com位于whitelist.txt中,因此应将其从主机文件中删除 预期产出: 主人 主机文件将是一个大于3-6 MB的较大文件 这将是一个巨大的过程 不需要从两个文件中删除相同的行。仅从主机文件 编辑 从之前删除的帖子中,我这样做的方式是: 将2个文件作为行数组加载到内存列表中; 为每个文件创建2个哈希集 为文件、哈希、行中的每一行

我有两个文本文件hosts file和whitelist.txt

主人

白名单.txt

单击按钮时,必须从主机文件中删除whitelist.txt中的行

ex:x.com位于whitelist.txt中,因此应将其从主机文件中删除

预期产出: 主人

主机文件将是一个大于3-6 MB的较大文件

这将是一个巨大的过程

不需要从两个文件中删除相同的行。仅从主机文件

编辑

从之前删除的帖子中,我这样做的方式是:

将2个文件作为行数组加载到内存列表中; 为每个文件创建2个哈希集 为文件、哈希、行中的每一行创建哈希项 计算每个字符串的MD5哈希,将64位的一半写入哈希 从每个哈希对哈希中提取密钥_ 使用筛选条件keys2提取的行不包含当前行的哈希 将结果写入文件 使用制度; 使用System.Collections.Generic; 使用System.IO; 使用System.Security.Cryptography; 使用系统文本; 使用System.Linq; 使用系统线程; 使用System.Threading.Tasks; 使用System.Runtime.CompilerServices; 使用系统诊断; 名称空间筛选器行 { 班级计划 { 静态异步任务主字符串[]args { var md5=md5.Create; var hashes=新HashSet; 长,字符串哈希字符串输入,编码=null { var bytes=Spanstackalloc byte[encoding.GetByteCountinput]; var destination=Spanstackalloc字节[md5.HashSize/8]; encoding.GetBytesinput,字节; 返回md5.TryComputeHashbytes、destination、out int\u字节 ?BitConverter.ToInt64 Destination.ToArray,输入:0,空; } 异步任务ReadFileAsyncstring文件名=> wait File.ReadAllLinesAsyncfileName.ConfigureWaitFalse; var dict1=await ReadFileAsyncargs[0]。ConfigureAwaitfalse; var dict2=await ReadFileAsyncargs[1]。ConfigureAwaitfalse; var hashes1=dict1.Select=>Hash,Encoding.UTF8; var hashes2=dict2.Select=>Hash,Encoding.UTF8; var keys1=new HashSethashes1.Select=>; var keys2=new HashSethashes2.Select=>; var秒表=新秒表; 秒表,开始; File.writeAllineSargs[0],哈希值1 .Where.=>!keys2.Contains..Item1 .选择\=>\.Item2; 秒表,手表; Console.WriteLineHello World!; } } 公共静态类秒表扩展 { 公共静态void watch此秒表秒表,字符串消息=, [CallerMemberName]字符串成员名=, [CallerFilePath]字符串sourceFilePath=, [CallerLineNumber]int sourceLineNumber=0=> 控制台写入线 ${stopwatch.appeased}+ ${message}+ ${memberName}+ ${sourceFilePath}:{sourceLineNumber}; } } 结果:过滤测试1000000行all.txt的44ms

使用Imports System.IO File类检索数据

StringBuilder需要在文件顶部导入System.Text。StringBuilder保存创建的代码,并在每次字符串更改时保存新字符串。字符串是不可变的。ReadAllLines返回文本文件中的行数组

循环浏览hosts.txt中的每一行,并检查whitelist.txt中的行数组中是否存在该行。如果不存在,请将其添加到StringBuilder

最后,将StringBuilder更改为字符串,并使用File.WriteAllText方法将所有文本写入hosts.txt


我相信@ArturMustafin提供的代码速度要快得多,但这可能会让您开始学习。

Hi!请提供您尝试过但不足以解决问题的任何背景研究”。有关详细信息,请参阅。Hai@pointum请帮助。我需要的是文件1中的行应该从文件2中删除。我不知道编码。我的英语也不好。没人在帮我。你删除了以前的一篇文章,但我用.net core 3.0得到了解决方案,可以吗?展示你的尝试already@ArturMustafin对我不知道这会是个问题。我在.NET4.5.2中工作。无论如何,请回答。谢谢。我的是windows窗体应用程序。不是控制台应用程序。无论如何,我会试试这个。@yoyoyoyo这是我项目的一部分,如果它解决了你的问题,你可以试试:/******/我不知道如何在我的应用程序中添加此代码。如果它是VB.net格式的,那就太好了。它可以转换吗?
google.com
facebook.com
x.com
y.com
z.com
youtube.com
duckduckgo.com
stackoverflow.com
w.com
w.com
x.com
y.com
z.com
google.com
facebook.com
youtube.com
duckduckgo.com
stackoverflow.com
Public Sub RemoveLines(file1path As String, file2path As String)
        Dim s1 As String() = IO.File.ReadAllLines(file1path)
        Dim s2 As String() = IO.File.ReadAllLines(file2path)
        Dim l As List(Of String) = New List(Of String) l.AddRange(s1.ToList) l.AddRange(s2.ToList) 
        If s1.ToList = s2.ToList Then
            RemoveLines = s1.text
        End If
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim linesFromHost = File.ReadAllLines("hosts.txt") 'You will need to add the full path 
    Dim linesFromWhiteList = File.ReadAllLines("whitelist.txt")
    Dim sb As New StringBuilder
    For Each line As String In linesFromHost
        'If the line from linesFromHost is not found in the linesFromWhiteList then add it to the StringBuilder
        If Not Array.Exists(linesFromWhiteList, Function(x) x = line) Then
            sb.AppendLine(line)
        End If
    Next
    File.WriteAllText("hosts.txt", sb.ToString)
    MessageBox.Show("Done")
End Sub