【发布时间】:2018-12-12 15:13:45
【问题描述】:
我有一个程序可以读取文件文件夹(总共 4GB),对它们进行索引,然后将它们添加到链接的 SQL 数据库中。这一切都发生在表单甚至加载之前。
现在我希望有另一个文件,每行包含一个 13 位数字,并从 VB 查询 SQL 数据库,搜索每个数字以返回包含该数字的文件夹、文件和行号。
我下面的方法现在有效,但速度很慢。我需要找到一种更快的方法来直接转到文件中的特定行以获取我的号码,并在该位置写入新的文本行。
Dim result = From n In System.IO.File.ReadLines("G:\USER\SearchThese.txt")
Select n.Substring(0, 13)
Dim MyFilePath As String
Dim linePos As String
Dim lines As String
'-- connection
Dim con As New SqlConnection(***MY SQL CONNECTION***)
Dim dataset As New DataSet
Dim datatable As DataTable
Dim dataadapter As New SqlDataAdapter
Dim sql As String
Dim i As Integer
'-- command
Dim cmd As New SqlCommand()
con.Open()
Using sw As New StreamWriter("G:\USER\TESTRUN1.txt")
For Each word As String In result
i = 0
sql = ("SELECT * FROM Test_Table WHERE DigNum = @word")
dataadapter = New SqlDataAdapter(sql, con)
dataadapter.SelectCommand.Parameters.AddWithValue("@word", word)
dataset = New DataSet()
dataadapter.Fill(dataset, "Test_Table")
While i < dataset.Tables("Test_Table").Rows.Count
linePos = dataset.Tables("Test_Table").Rows(i).Item(4).ToString()
MyFilePath = dataset.Tables("Test_Table").Rows(i).Item(1).ToString()
i += 1
Using sr As New StreamReader(MyFilePath)
For n As Integer = 1 To linePos
lines = sr.ReadLine
Next
sw.WriteLine(lines)
End Using
End While
Next
End Using
MsgBox("Complete!")
就像我说的那样,这很好用,但即使只搜索 5 个数字也需要相当长的时间。我猜是流式阅读器会减慢它的速度,但我不知道。
对于任何人来说,我的数据库表有这些列:
DigNum | FilPth | FilDte | DteAdd | LnePos
【问题讨论】:
-
如果文件的内容没有改变(附加的除外),那么您应该考虑将位置存储在文件中。说“读取从位置 23423 开始的行”而不是“读取第 423 行”要容易得多
-
对不起@the_lotus 觉得我不太明白
-
你需要调用 ReadLine 直到你到达你想要的那一行。如果您存储了该行的位置(从文件的开头),您可以将Seek 存储到该位置并从那里开始读取。
-
作为参考,这里是文件的索引方式:stackoverflow.com/questions/53520276/…
-
这里要记住一件事:将更改写回文件会使我两周前帮助您创建的索引无效。每次更改文件时都必须重新构建索引。