如何解决提高文本文件读取速度
我使用一个程序读取文本文件,该文件的格式始终相同(见图)。我的源代码工作正常,但对我来说似乎有点长。有没有人有任何建议让它看起来更短/更好?
我唯一关心的是从文件中找出 xmin、xmax、ymin 和 ymax 的 4 个值以及点。关键是对于 4 个值,我需要每行 6 行。我不能使用 for 循环的原因是因为我找不到专门引用 xmin / xmax / ymin / ymax 的方法。
是否有比 System.IO.File.ReadAllLines
(加载整个文件)更快的解决方案?
akt_Zeile
表示英文当前行。
erfolg
意味着成功,在类型转换的意义上。
PunkteListe
表示点列表/带点。
#Disable Warning IDE1006 ' Benennungsstile 'Naming rule violation
Imports Microsoft.WindowsAPICodePack.Dialogs
Public NotInheritable Class Form1
Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
End Sub
Private Async Sub Button_lesen_Click(sender As Object,e As EventArgs) Handles Button_lesen.Click
Await Task.Run(Sub() einlesen_und_testen())
End Sub
Private Sub einlesen_und_testen()
Dim Pfad As String
Using OFD1 As New CommonOpenFileDialog
OFD1.Title = "Datei auswählen"
OFD1.Filters.Add(New CommonFileDialogFilter("Textdateien",".txt"))
OFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
Dim Result As CommonFileDialogResult
Me.Invoke(Sub() Result = OFD1.ShowDialog())
If Result = CommonFileDialogResult.Ok Then
Pfad = OFD1.FileName
Else
Return
End If
End Using
Me.Invoke(Sub() Button_lesen.BackColor = Color.FromArgb(255,255,0)) 'yellow
Dim readText() As String = System.IO.File.ReadAllLines(Pfad,System.Text.Encoding.UTF8)
Dim xmin,xmax,ymin,ymax,Anzahl_Punkte As Integer
Dim akt_Zeile1 As String = readText(5).Substring(6,readText(5).Length - 6)
Dim erfolgreich1 As Boolean = Integer.TryParse(akt_Zeile1,xmin)
If Not erfolgreich1 Then
MessageBox.Show("Could not parse ‘String’ to ‘Integer’.","Error",MessageBoxButtons.OK,MessageBoxIcon.Warning)
Return
End If
Dim akt_Zeile2 As String = readText(6).Substring(6,readText(6).Length - 6)
Dim erfolgreich2 As Boolean = Integer.TryParse(akt_Zeile2,xmax)
If Not erfolgreich2 Then
MessageBox.Show("Could not parse ‘String’ to ‘Integer’.",MessageBoxIcon.Warning)
Return
End If
Dim akt_Zeile3 As String = readText(7).Substring(6,readText(7).Length - 6)
Dim erfolgreich3 As Boolean = Integer.TryParse(akt_Zeile3,ymin)
If Not erfolgreich3 Then
MessageBox.Show("Could not parse ‘String’ to ‘Integer’.",MessageBoxIcon.Warning)
Return
End If
Dim akt_Zeile4 As String = readText(8).Substring(6,readText(8).Length - 6)
Dim erfolgreich4 As Boolean = Integer.TryParse(akt_Zeile4,ymax)
If Not erfolgreich4 Then
MessageBox.Show("Could not parse ‘String’ to ‘Integer’.",MessageBoxIcon.Warning)
Return
End If
Dim akt_Zeile5 As String = readText(10).Substring(4,3)
Dim erfolgreich5 As Boolean = Integer.TryParse(akt_Zeile5,Anzahl_Punkte)
If Not erfolgreich5 Then
MessageBox.Show("Could not parse ‘String’ to ‘Integer’.",MessageBoxIcon.Warning)
Return
End If
Dim PunkteListe As New List(Of PointF)
For i As Integer = 11 To readText.Length - 2 Step 1 'Length - 2 because the last line is named “End” (without line break) .
Dim aktuelle_Zeile() As String = readText(i).Split(Convert.ToChar(9))
Dim _1 As Single
Dim erfolg1 As Boolean = Single.TryParse(aktuelle_Zeile(0),_1)
Dim _2 As Single
Dim erfolg2 As Boolean = Single.TryParse(aktuelle_Zeile(1),_2)
If erfolg1 AndAlso erfolg2 Then
PunkteListe.Add(New PointF(_1,_2))
Else
MessageBox.Show($"Could not parse ‘String’ to ‘Single’. Line #{i + 1}",MessageBoxIcon.Warning)
Return
End If
Next
Me.Invoke(Sub() Button_lesen.BackColor = Color.FromArgb(0,225,0)) 'green
End Sub
End Class
#Enable Warning IDE1006 ' Benennungsstile
解决方法
简单的方法是使用 File.ReadLines 和 LINQ
跳过第一行,因为提到的问题结构总是相同的,那么假设总是跳过相同的行,并且只取那些是感兴趣。
与 File.ReadAllLines
不同,File.ReadLines
的优点是它不会加载整个文件。
一个基于文件结构的简单例子,类似于问题:
Imports System.IO
Sub Main()
For Each line As String In File.ReadLines("C:\temp\test.txt").Skip(5).Take(4).ToArray()
Console.WriteLine(line)
Next
End Sub
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。