Проблема с объектом My.Computer.FileSystem - PullRequest
0 голосов
/ 06 июня 2019

По заданию я читаю данные из одного файла, обрабатываю их и записываю в другой файл.Обработка заключается в поиске записи действительных чисел с нулевой дробной частью, эти числа должны быть записаны в другой файл.Пример, 123.000 - запись, 12b.0 - не запись

И эта программа работает с OpenFileDialog, но не работает с My.Computer.FileSystem

Я попытался создать разделенный массив с помощью vbnewline-separator, но это не помогло.Когда я построчно выполняю отладку, и программа достигает нужного числа (на входе 123.0), флаг 1 не учитывается, поэтому число не передается в результате

        Try
            content = My.Computer.FileSystem.ReadAllText(fileName)
        Catch ex As Exception
            MsgBox("Error:" & vbCrLf & vbCrLf & ex.Message)
        End Try
    End Sub
    Sub writeFile(ByVal fileName As String, ByRef content As String)
        Try
            My.Computer.FileSystem.WriteAllText(fileName, content, False)
        Catch ex As Exception
            MsgBox("Error")
        End Try
    End Sub
    Sub ch(ByVal Str As String, ByRef Result As String)
        Dim k, i, m, flag1, flag2 As Integer
        Result = ""
        k = Str.IndexOf(".", 1)
        m = Str.Length - 1
        If k <> -1 Then
            flag1 = 0
            flag2 = 0
            For i = 0 To k - 1
                If Str.Substring(i, 1) >= "0" And Str.Substring(i, 1) <= "9" Then
                    flag1 = flag1 + 1
                Else
                    Exit For
                End If
            Next
            If flag1 = k Then
                For i = k + 1 To m
                    If Str.Substring(i, 1) = "0" Then
                        flag2 = flag2 + 1
                    Else
                        Exit For
                    End If
                Next
            Else
            End If
            If flag2 = m - k And flag2 <> 0 Then
                Result = Str
            Else
            End If
        Else
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim line, line2, path, path2, res, temp As String
        temp = ""
        line = ""
        line2 = ""
        path = ""
        path2 = ""
        res = ""
        path = TextBox1.Text
        path2 = TextBox2.Text
        readFile(path, line)
        TextBox3.Text = CStr(line)
        Dim mass = line.Split(CChar(vbNewLine))
        For i As Integer = 0 To UBound(mass)
            ch(mass(i), temp)
            line2 = line2 + temp
        Next
        TextBox4.Text = line2
        writeFile(path2, line2)
    End Sub

Ввод: 123

123.

123.0

123.0a0

123.000

12g.00

(6 строк без пробелов в окончаниях) Вывод: пустой файл

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Ваш код работает нормально для меня.

Здесь немного переработано использование ReadAllText () и небольшое изменение с помощью Split ():

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim InputFileName As String = TextBox1.Text
    Dim lines() As String = My.Computer.FileSystem.ReadAllText(InputFileName).Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)

    Dim line2 As String = ""
    For Each line As String In lines
        Dim result As String = ""
        ch(line, result)
        If result <> "" Then
            line2 = line2 + result + vbCrLf
        End If
    Next
    Debug.Print(line2)
End Sub

Sub ch(ByVal Str As String, ByRef Result As String)
    Dim k, i, m, flag1, flag2 As Integer
    Result = ""
    k = Str.IndexOf(".", 1)
    m = Str.Length - 1
    If k <> -1 Then
        flag1 = 0
        flag2 = 0
        For i = 0 To k - 1
            If Str.Substring(i, 1) >= "0" And Str.Substring(i, 1) <= "9" Then
                flag1 = flag1 + 1
            Else
                Exit For
            End If
        Next
        If flag1 = k Then
            For i = k + 1 To m
                If Str.Substring(i, 1) = "0" Then
                    flag2 = flag2 + 1
                Else
                    Exit For
                End If
            Next
        End If
        If flag2 = m - k And flag2 <> 0 Then
            Result = Str
        End If
    End If
End Sub

Мой входной файл:

123
123.
123.0
123.0a0
123.000
12g.00

Вывод в немедленном окне:

123.0
123.000
0 голосов
/ 06 июня 2019

Вот другой подход:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim InputFileName As String = TextBox1.Text
    Try
        Dim lines() As String = System.IO.File.ReadAllLines(InputFileName)
        Dim RealNumbers As List(Of String) = FindRealNumbersEndingInZeroOnly(lines)
        Dim OutputFileName As String = TextBox2.Text
        Try
            System.IO.File.WriteAllLines(OutputFileName, RealNumbers)
            MessageBox.Show("Done!")
        Catch ex As Exception
            MessageBox.Show("FileName: " & OutputFileName & vbCrLf & vbCrLf & "Error: " & ex.Message, "Error Writing File")
        End Try
    Catch ex As Exception
        MessageBox.Show("FileName: " & InputFileName & vbCrLf & vbCrLf & "Error: " & ex.Message, "Error Reading File")
    End Try
End Sub

Public Function FindRealNumbersEndingInZeroOnly(ByVal lines() As String) As List(Of String)
    Dim matches As New List(Of String)
    For Each line As String In lines ' check each line from the file
        Dim startAt As Integer = 0
        Dim number As String = ".0" ' bare minimum starter for a real number
        Dim periodFollowedByZero As Integer = line.IndexOf(number, startAt)
        While periodFollowedByZero <> -1 ' there might be more than one real number per line
            ' seach backwards from the period, pre-pending any digits found
            For before As Integer = (periodFollowedByZero - 1) To 0 Step -1
                Dim ch As String = line.Substring(before, 1)
                If Char.IsDigit(ch) Then
                    number = ch & number
                Else
                    Exit For
                End If
            Next

            If Not number.StartsWith(".") Then ' if we don't have a period at the beginning we have a number!
                ' search forwards from the ".0", appending any digits found; stop if non-zero digit is found
                Dim zeroesOnlyAfterwards As Boolean = True ' assume true until proven otherwise
                For after As Integer = (periodFollowedByZero + 2) To (line.Length - 1)
                    Dim ch As String = line.Substring(after, 1)
                    If Char.IsDigit(ch) Then
                        If ch = "0" Then
                            number = number & ch
                        Else
                            zeroesOnlyAfterwards = False
                            Exit For
                        End If
                    Else
                        Exit For
                    End If
                Next

                If zeroesOnlyAfterwards Then
                    ' add the found number to our results
                    matches.Add(number)
                End If
            End If

            ' see if there are any more candidates on this line
            startAt = periodFollowedByZero + 2
            periodFollowedByZero = line.IndexOf(".", startAt)
        End While
    Next
    Return matches
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...