Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Текстовый файл в масивы


Автор: ss777 24.4.2008, 23:03
Каким образом можно заполнить масивы данными из текстового файла в котором в качестве разделителя столбов используется табуляция, нужно чтобы каждый из столбцов был записан в отдельный масив. 
Вот до чего дошел дальше не получается в цикле For
Код

Public Class Form1
    Dim intKod() As UInteger
    Dim strMNN() As String
    Dim strNLP() As String
    Dim decCena() As Decimal
    Dim dblMYP() As Double

    Private Sub ОткрытьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ОткрытьToolStripMenuItem.Click
        ' Открываем файл
        If ofd1.ShowDialog = Windows.Forms.DialogResult.OK Then
            ' Создаем объект на основе класса IO.StreamReader и открываем с помощью него файл
            Dim clsChitatel As New IO.StreamReader(ofd1.FileName)
            ' Переменная содержащая строку из файла
            Dim strLine As String
            ' Переменная содержащая значение столбика из файла
            Dim strTab() As String
            ' Цикл до достежения конца файла
            Do Until clsChitatel.EndOfStream
                ' Читаем строку и записываем в переменную
                strLine = clsChitatel.ReadLine()
                ' Обрабатывем строку и создаем новые строки в качестве разделителя строк vbTab  
                strTab = Split(strLine, vbTab)
                ' Дальше не получается
                For i As Integer = 0 To UBound(strTab)
                    intKod(i) = strTab(0)
                    strMNN(i) = strTab(1)
                    strNLP(i) = strTab(2)
                    decCena(i) = strTab(3)
                    dblMYP(i) = strTab(4)
                Next i
            Loop
        End If
    End Sub
End Class


Автор: tea_723 25.4.2008, 22:35
Код

Public Class Form1
    Dim intKod As ArrayList = New ArrayList
    Dim strMNN As ArrayList = New ArrayList
    Dim strNLP As ArrayList = New ArrayList
    Dim decCena As ArrayList = New ArrayList
    Dim dblMYP As ArrayList = New ArrayList

    Private Sub ОткрытьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ОткрытьToolStripMenuItem.Click
        ' Открываем файл
        If ofd1.ShowDialog = Windows.Forms.DialogResult.OK Then
            ' Создаем объект на основе класса IO.StreamReader и открываем с помощью него файл
            Dim clsChitatel As New IO.StreamReader(ofd1.FileName)
            ' Переменная содержащая строку из файла
            Dim strLine As String
            ' Переменная содержащая значение столбика из файла
            Dim strTab() As String
            Dim counter As Integer = 0
            ' Цикл до достежения конца файла
            Do Until clsChitatel.EndOfStream
                ' Читаем строку и записываем в переменную
                strLine = clsChitatel.ReadLine()
                ' Обрабатывем строку и создаем новые строки в качестве разделителя строк vbTab  
                strTab = Split(strLine, vbTab)
                try
                      intKod(counter) = strTab(0)
                      strMNN(counter) = strTab(1)
                      strNLP(counter) = strTab(2)
                      decCena(counter) = strTab(3)
                      dblMYP(counter) = strTab(4)
                Catch ex As Exception
                       MsgBox(ex.ToString())
                End Try
                counter = counter + 1
            Loop
        End If
    End Sub
End Class

Во первых, у тебя выходные массивы не были определены. Если ты знаешь их длину изначально, 
то можно использовать Array, если длина неопределена, используй ArrayList.
 
Во вторых, цикл for тебе совешенно не нужен, ты и так знаешь что в каком столбце.

В третьих Try... Catch на тот случай, если все-таки Split неправильно сработал или данных не хватает.



Автор: ss777 26.4.2008, 07:44
Спасибо, покурил литературу разного рода, и справился 
код с комментариями посмотрите если что подработать можно
Код
Imports System.Text.RegularExpressions
Public Class Form1
    Dim intKod() As Integer
    Dim strMNN() As String
    Dim strNLP() As String
    Dim decCena() As Decimal
    Dim dblMYP() As Double

    Private Sub ОткрытьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ОткрытьToolStripMenuItem.Click
        ' Открываем файл
        If ofd1.ShowDialog = Windows.Forms.DialogResult.OK Then
            ' Создаем объект(поток) на основе класса IO.StreamReader и открываем с помощью него файл
            Dim clsSchitatel As New IO.StreamReader(ofd1.FileName)
            ' Подсчитываем количество строк в файле для определения длинны масивов(количество строк в каждом столбике)
            Dim intLines As UInteger = Regex.Matches(clsSchitatel.ReadToEnd, ".+\n*").Count
            ' Закрываем поток подсчета строк
            clsSchitatel.Close()
            ' Создаем поток для чтения строк
            Dim clsChitatel As New IO.StreamReader(ofd1.FileName)
            ' Устанавливаем длинну масивов
            ReDim intKod(0 To intLines)
            ReDim strMNN(0 To intLines)
            ReDim strNLP(0 To intLines)
            ReDim decCena(0 To intLines)
            ReDim dblMYP(0 To intLines)
            'MsgBox(intLines)
            ' Переменная содержащая строку из файла
            Dim strLine As String
            ' Масив содержащий значение столбиков из строки файла
            Dim strTab() As String
            ' Цикл до достежения конца файла
            Do Until clsChitatel.EndOfStream
                ' Читаем строку, после курсор встает на начало следующей строки
                strLine = clsChitatel.ReadLine()
                ' Создаем строки в качестве разделителя строк vbTab  
                strTab = Split(strLine, vbTab)
                ' Объявляем счетчик для индексации массива
                Dim s As Integer
                intKod(s) = strTab(0)
                strMNN(s) = strTab(1)
                strNLP(s) = strTab(2)
                decCena(s) = strTab(3)
                dblMYP(s) = strTab(4)
                ' Переводим все масивы на следующий индекс
                s += 1
                ' Возвращаемся за новой порцией строк для strTab()
            Loop
            ' Закрываем поток
            clsChitatel.Close()
        End If
    End Sub
End Class

Итог работает как надо. Если скажем есть текстовый файл с разделителем столбцов (знак табуляции) 
Например
Код
123    ABC    DEF    456    789
135    ACE    GIK    246    579

Получаем:
Код
intKod(0)=123    strMNN(0)=ABC    strNLP(0)=DEF    decCena(0)=456    dblMYP(0)=789
intKod(1)135    strMNN(1)=ACE    strNLP(1)=GIK    decCena(1=)246    dblMYP(1)=579
                                    и т.д.


Попробую по твоему совету через ArrayList, в другом форуме тоже посоветовали его использовать, но в данном случае определяя количество строк можно определить и длинну масива, но все же с ArrayList будет правильнее, пошел читать литературу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)