Я пытаюсь выяснить, как прочитать текстовый файл в массив в vb.net - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать программу на vb.net (формы) для обработки данных с спектрометра UVvis.

Вывод txt файла выглядит следующим образом.

"180809_QuartzRefTrans.spc - RawData"
"Wavelength nm.","T%"
400.00,90.822
401.00,90.800
402.00,90.823
403.00,90.811
404.00,90.803
405.00,90.804
406.00,90.816
407.00,90.811
408.00,90.833
409.00,90.837
410.00,90.847
411.00,90.827
412.00,90.839
413.00,90.851
414.00,90.828
415.00,90.879
416.00,90.846

и так далее.

То, что я пытаюсь сделать, это прочитать данные в массив, чтобы я мог манипулировать столбцами. Мне нужно пропустить первые две строки, чтобы у меня были только числовые данные. Мне также нужно, чтобы отсортировать массив от низшего к высшему (длина волны). Иногда мы бежим от 800-> 200 нм, а затем случайно вводим 200-> 800 нм

Imports System.IO
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1
Public Class RefTrans
    Public Property Wavelength As Double
    Public Property Transpercent As Double
End Class
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim strtext As String

    OpenFileDialog1.Title = "Open Text Files"
    OpenFileDialog1.ShowDialog()

    strtext = OpenFileDialog1.FileName

    TextBox1.Text = My.Computer.FileSystem.GetName(strtext)
    Label1.Text = My.Computer.FileSystem.GetName(strtext)

    Dim line1 As String
    Dim output1 As New ArrayList
    Using sr As New IO.StreamReader(strtext)
        sr.ReadLine()
        sr.ReadLine()
        Do While sr.Peek() >= 0
            line1 = sr.ReadLine()
            output1.Add(line1)
        Loop
    End Using

    If strtext <> "" Then
        Dim SR As New StreamReader(strtext)
        SR.ReadLine()
        Do Until SR.EndOfStream
            TextBox3.Text = TextBox3.Text & SR.ReadLine & vbCrLf

        Loop
        SR.Close()
    End If

    Dim data1 = IO.File.ReadLines(strtext).
    Skip(2).
    Select(Function(line)
               Dim parts = line.Split(","c)

               Return New RefTrans With {.Wavelength = CDbl(parts(0)),
                                         .Transpercent = CDbl(parts(1))}
           End Function).
    ToArray() = line.Split(","c)

End Sub    
End Class

1 Ответ

0 голосов
/ 07 сентября 2018

Вот пример, который даст вам массив Tuple(Of Double, Double):

Dim data = IO.File.ReadLines(filePath).
                   Skip(2).
                   Select(Function(line)
                              Dim parts = line.Split(","c)

                              Return Tuple.Create(CDbl(parts(0)), CDbl(parts(1)))
                          End Function).
                   ToArray()

Метод IO.File.ReadLines будет читать строки файла. Если метод ReadAllLines читает весь файл, а затем возвращает строки в виде массива String, метод ReadLines представляет строки файла в виде перечислимого списка, и строки считываются из файла только при их использовании. , В частности, для больших файлов ReadLines более эффективен, чем ReadAllLines, поскольку он сначала создает промежуточный массив, который вам на самом деле не нужен.

Метод Skip позволяет получить доступ к элементам в списке, начиная с определенного индекса. В случае чтения файла вам нужно читать каждую строку независимо, но вызов Skip(2) для результата File.ReadLines означает, что первые две строки файла будут отброшены после чтения, а любая последующая обработка будет только выполнена, но строки от третьего.

Метод Select - это в основном преобразование. В нем говорится, создать список вывода, содержащий элемент для каждого элемента в списке ввода, где элемент вывода является результатом преобразования элемента ввода. Преобразование определяется функцией, которую вы предоставляете. В этом случае строка из файла является входной, и преобразование состоит в том, чтобы разделить эту строку на запятую, преобразовать две подстроки в значения Double и затем создать Tuple, содержащий эти два значения Double.

Метод ToArray берет любой перечисляемый список, то есть любой объект, который реализует IEnumerable(Of T), и возвращает массив, содержащий элементы из этого списка. В этом случае Select возвращает IEnumerable(Of Tuple(Of Double, Double)), поэтому ToArray возвращает массив Tuple(Of Double, Double).

Если вы хотите написать все это длинным хендом, то это будет выглядеть так:

'Get all the lines of the file.
Dim step1 As IEnumerable(Of String) = IO.File.ReadLines(filePath)

'Skip the first two lines.
Dim step2 As IEnumerable(Of String) = step1.Skip(2)

'Split each line into two substrings.
Dim step3 As IEnumerable(Of String()) = step2.Select(Function(line) line.Split(","c))

'Convert substrings to numbers and combine.
Dim step4 As IEnumerable(Of Tuple(Of Double, Double)) = step3.Select(Function(parts) Tuple.Create(CDbl(parts(0)), CDbl(parts(1))))

'Create an array of Tuples.
Dim data As Tuple(Of Double, Double)() = step4.ToArray()

A Tuple - это объект общего назначения для группировки значений. Вы можете использовать Tuple для разовых случаев, а не для определения своего собственного класса. Вы можете предпочесть определить свой собственный класс во всех случаях, и вы должны определить свой собственный класс, где вы будете широко использовать данные. В этом случае ваш собственный класс может выглядеть так:

Public Class RefTrans
    Public Property Wavelength As Double
    Public Property TransPercent As Double
End Class

и код станет:

Dim data = IO.File.ReadLines(filePath).
                   Skip(2).
                   Select(Function(line)
                              Dim parts = line.Split(","c)

                              Return New RefTrans With {.Wavelength = CDbl(parts(0)),
                                                        .TransPercent = CDbl(parts(1))}
                          End Function).
                   ToArray()

В этом случае у вас есть свойства Wavelength и TransPercent для каждого элемента вашего массива. Если вы используете Tuples, то свойства имеют общие имена Item1 и Item2.

Если у вас есть массив, вы можете использовать любую подходящую перегрузку Array.Sort для выполнения сортировки, например,

Array.Sort(data, Function(d1, d2) d1.Item1.CompareTo(d2.Item1))

Это позволит отсортировать Tuples путем сравнения их свойств Item1, которые содержат значения длины волны. Если вы используете свой собственный класс, то, очевидно, вы указываете свое собственное свойство, например, Wavelength свойство в классе RefTrans, которое я показал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...