我看了List.Contains returns false, even though it seems it should return true,但他的代码结构与我的有点不同,所以我不确定我是否有同样的问题。
在我继续之前,让我解释一下我的结果应该是什么。
我们有2个输入文件,文件1包含email:hash
,另一个包含email:hash
和email:plain
。
结束输出:如果第二个文件在明文之后有明文:,输出它(确保在输出文件1的电子邮件时不复制:如果没有为该电子邮件/哈希创建文件2行,则为哈希),否则输出哈希
tl; dr - 基本上将第二个文件overwrite prioritized
放在第一个文件上。
(First File Randomized)
ABC_123@gmail.com:f6deea50e7eeb2d930fab83ccc32cdfe
123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806
123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
abc123@email.com:2d366131008f89781b8379bed3451656
(Second File Randomized)
123abc@domain.ext:aaaaaaaa
ABC_123@gmail.com:cccccccc
abc123@email.com:bbbbbbbb
newemail@hotmail.com:ddddddddd
Output should be:
123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
123abc@domain.ext:aaaaaaaa
ABC_123@gmail.com:cccccccc
abc123@email.com:bbbbbbbb
newemail@hotmail.com:ddddddddd
(Output from Tests - "->" lines shouldn't be outputted.)
123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
->123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806
123abc@domain.ext:aaaaaaaa
ABC_123@gmail.com:cccccccc
->ABC_123@gmail.com:f6deea50e7eeb2d930fab83ccc32cdfe
abc123@email.com:bbbbbbbb
newemail@hotmail.com:ddddddddd
在第二个OpenFileDialog块中,它始终返回false,直到 For Each combo as Match in matches
中的最后一行。
奇怪的是,如果我将第二个正则表达式从(.*)@(.*):(.*)
更改为(.*)@(.*):([a-f0-9]{32})
它出于某种原因可行,那么问题是它只匹配Email@domain.ext:{md5}
并且不匹配例如{{1这是一个要求。
(最新的代码更新,我在试图修复它时更加破坏了它,所以现在甚至无法工作)。
我睡了一次然后重新尝试修复它,到目前为止我几乎都在那里,除了一个电子邮件之外它正确覆盖:哈希出于某种原因。
Image showing error 正如你所看到的,它将123abc@domain.ext从散列更改为aaaaaaa,但对于ABC_123@gmail.com,它并没有出于某种奇怪的原因。同样是的,abc123 @email.com散列确实发生了变化,所以奇怪的是随机电子邮件:hash没有改变。
我一直在这个约<罢工> 9 罢工> 12个多小时。 (没有夸大其词),我真的很喜欢对正在发生的事情的启发。
我已经尝试了很多替代品,以至于我现在甚至都记不住了。
代码:(更新后的x3)
提醒:请阅读以上关于我想要实现的目标:)
Email@domain.ext:abc123
答案 0 :(得分:0)
嗨,我认为这应该适合你的需要。
Dim ofd = New OpenFileDialog()
ofd.Title = "Import..."
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
ofd.Filter = "Text files|*.txt"
ofd.Multiselect = True
Dim output As New Dictionary(Of String, String) 'key = mail, value = plain/hash
If (ofd.ShowDialog() = DialogResult.OK And ofd.CheckFileExists = True) Then
For Each filename As String In ofd.FileNames
Using sr As New StreamReader(filename)
Dim combos As MatchCollection = New Regex("(.*)@(.*):(.*)").Matches(sr.ReadToEnd)
For Each match As Match In combos
Dim tmp() As String = Split(match.ToString, ":")
tmp(1) = tmp(1).Replace(vbCr, "").Replace(vbLf, "") 'Delete carriage return
If Not output.ContainsKey(tmp(0)) Then
output.Add(tmp(0), tmp(1))
Else
If output(tmp(0)).Length = 32 Then 'condition whether to change the value or not. You need to design it to your needs.
output(tmp(0)) = tmp(1)
End If
End If
Next match
End Using
Next filename
End If
我不知道您的数据中是否有回车。我尝试使用简单的txt文件。 您需要根据需要更改条件。我看到哈希有32个标志,而纯文本则没有......
答案 1 :(得分:0)
你想要的是你拥有的两组线的联合,而这正是Enumerable.Union
所提供的,只要我们有办法区分相等的元素。
从这开始我们首先定义相等比较器:
Class MailEqualityComparer
Implements IEqualityComparer(Of String)
Overloads Function Equals(mail1 As String, mail2 As String) As Boolean Implements IEqualityComparer(Of String).Equals
' assume input validated
Return mail1.Split(":"c)(0).Equals(mail2.Split(":"c)(0))
End Function
Overloads Function GetHashCode(mail As String) As Integer Implements IEqualityComparer(Of String).GetHashCode
' assume input validated
Return mail.Split(":"c)(0).GetHashCode
End Function
End Class
对于这个类,如果它们在:
之前的部分相等,那么两个字符串是相等的。
然后你只需要使用该类的实例来确保正确的相等:
' file1 and file2 are String arrays
' they could be the result of File.ReadAllLines for example
Dim file1 = {
"ABC_123@gmail.com: f6deea50e7eeb2d930fab83ccc32cdfe",
"123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806",
"123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd",
"abc123@email.com: 2d366131008f89781b8379bed3451656"
}
Dim file2 = {
"123abc@domain.ext: aaaaaaaa",
"ABC_123@gmail.com: cccccccc",
"abc123@email.com: bbbbbbbb",
"newemail@hotmail.com: ddddddddd"
}
' result is an IEnumerable(Of String)
' add ToArray (for example) if you want to materialize the result
Dim result = file2.Union(file1, New MailEqualityComparer) ' note the order ; it matters
' result content :
' ----------------
' 123abc@domain.ext: aaaaaaaa
' ABC_123@gmail.com: cccccccc
' abc123@email.com: bbbbbbbb
' newemail@hotmail.com: ddddddddd
' 123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
它只是让我们“我们如何确定联盟参数的顺序?” 为此,我们必须知道哪个文件包含“纯文本”内容,以及您在撰写本文时未提供的信息。
(注意:使用Hashset(Of String)
或SortedSet(Of String)
及其UnionWith
方法可以实现相同的目标)
[SortedSet需要IComparer(Of String)
而不是IEqualityComparer(Of String)
]
如果我理解你的评论(我不确定);这是使用SortedSet可以完成的事情:
Class MailComparer
Implements IComparer(Of String)
Function Compare(mail1 As String, mail2 As String) As Integer Implements IComparer(Of String).Compare
' assume input validated
Return mail1.Split(":"c)(0).CompareTo(mail2.Split(":"c)(0))
End Function
End Class
' file1 and file2 are String arrays
' they could be the result of File.ReadAllLines for example
Dim file1 = {
"ABC_123@gmail.com: f6deea50e7eeb2d930fab83ccc32cdfe",
"123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806",
"123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd",
"abc123@email.com: 2d366131008f89781b8379bed3451656"
}
Dim file2 = {
"123abc@domain.ext: aaaaaaaa",
"ABC_123@gmail.com: cccccccc",
"abc123@email.com: bbbbbbbb",
"newemail@hotmail.com: ddddddddd"
}
' allLines is an IEnumerable(Of String)
Dim allLines = file2.Concat(file1) ' note the order ; it matters
Dim result As New SortedSet(Of String)(allLines, New MailComparer)
' result content :
' ----------------
' 123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
' 123abc@domain.ext: aaaaaaaa
' ABC_123@gmail.com: cccccccc
' abc123@email.com: bbbbbbbb
' newemail@hotmail.com: ddddddddd
我没有看到使用8行类的地方并不简单;但也许我错过了这一点......