Двухмерный массив

Katerinishe

я новичок поэтому наверное очень глупый вопрос.Есть файл текстовый из 5 строк и 22 полей разделенных ";"Я открываю его и читаю построчно в циклеLine Input #1, TextLineпотом я записываю каждую строку в массивParam = Split(texLine, ";") (выше декларирую переменную Dim Param() As String)так вот я не понимаю что за массив у меня создается? одномерный или двухмерный?Как мне сделать так чтобы каждая новая строка из файла добавлялась бы как новая строка массива?как увидеть что лежит в Param(3,16)?
10 ответов

Katerinishe

Если просто считывать каждую строку, то конечно получится одномерный массив из пяти элементов. Чтобы считать данные в двухмерный массив нужно для начала уточнить: каким образом данные записаны в текстовый файл? каждый элемент имеет фиксированное количество символов т.е все поля выровнены относительно левого края или нет? От этого зависит способ считывания данных.


Katerinishe

Chto s massivom ne tak esli: LBound(Param) =0UBound(Param) =-1Esli stroka VOI name;VOI type;Volume [mm³];Dmin [%];Dmax [%];Dmean [%];S.D. [%];Dcrit [%];D10 [%];D90 [%];Dx [%];Dx mm³ [%];Dx mm³ [%];Vcrit [mm³];V100 [mm³];V120 [mm³];V150 [mm³];V200 [mm³];V300 [mm³];Vx [mm³];Vx cGy [mm³];Vx cGy [mm³];obrabatyvaetsa takParam = Split(texLine, ";")Ne dolzhno li byt tak:LBound(Param) =0UBound(Param) =21kak uvidet' cho v Param?ja pishuMsgBox(Param)no programma rugaetsja


Katerinishe

mr.haker,Ja ego razbivaju s pomoshju Split


Katerinishe

mr.haker,Я поняла что создаетя пустой массив :-(как мне все же из моей строки сделать массив содержащий то что находитя между ";"?


Katerinishe

Насколько я знаю по своему опыту, функция Split должна использоваться совместно с функцией Join, тогда ошибки не будет.Param = Split(texLine, ";") Param2 = Join(Param, "") msgbox (Param2)Но я не совсем понимаю, для чего ты используешь функцию split. Она просто вырежет из твоей строки все точки с запятой, но никак не разделит данные. Данные в текстовый файл лучше записать в другом виде, если это в твоей компетенции...


Katerinishe

> Автор: mr.haker> Но я не совсем понимаю, для чего ты используешь функцию split. Она просто вырежет из твоей строки все точки с > запятой, но никак не разделит данные.Что значит не разделит? сплит как раз разделяет строку на элементы массива, используя символ разделитель для разделенияMSDN


Katerinishe

Набросал вот такой код, должно работать. По крайней мере у меня всё работает правильно.
Private MyArray(<b>5</b>, <b>22</b>)
Private TextLine(<b>5</b>)

Private Sub Command1_Click()

MyFile = FreeFile

Open ("C:\Data.txt") For Input As #MyFile
 

 For i = <b>0</b> To <b>4</b>
 
 Line Input #MyFile, TextLine(i)
 
 SplitArray = Split(TextLine(i), ";")
 
 For j = <b>0</b> To <b>21</b>
 
 MyArray(i, j) = SplitArray(j)
 
 Next j
 
 Next i
 
 Close #MyFile
 
End Sub


Katerinishe

Теперь считать какой-то конкретный элемент будет просто:
Private Sub Command2_Click()
MsgBox MyArray(<b>0</b>, <b>21</b>)
End Sub
Это код для считывания последнего элемента первой строки.Только всегда учитывай то, что если нужно считать во второй строеке пятый элемент, писать надоMyArray(1, 4), т.е. отнимать единицу от номера элемента строки и от номера элемента столбца. Можно, конечно, сделать и по-другому, чтобы считывать данные, не отнимая единицу, если тебе это нужно, но подскажу как, хотя я думаю тут догадаться будет не сложно.Кстати, тод код, что я до этого привёл будет работать если у тебя 5 строк и в каждой по 22 поля, т.е. всего 5*22 =110 данных, по крайней мере я так понял задачу. P.S.надо было писать не MsgBox(Param) а MsgBox(Param(5)), где число - номер элемента строки.


Katerinishe

Katerinishe,В. так вот я не понимаю что за массив у меня создается? одномерный или двухмерный? О. ОдномерныйВ. Как мне сделать так чтобы каждая новая строка из файла добавлялась бы как новая строка массива?О. Декларируй двумерный массив. В его каждую новую строку пиши одномерный массив Param как результат работы Split после каждой Line Input #1, TextLine. Не забудь Redim Preserve по ВТОРОМУ индексу двумерного массива на каждой итерации Line Input #1, TextLine и Param = Split(texLine, ";"). Увеличивай второй индекс на один.В. как увидеть что лежит в Param(3,16)?О. Никак. Он у тебя будет одномерный, а не двумерный, поскольку Split возвращает одномерный массив. Если тебе в принципе надо посмотреть содержимое переменной как таковой, воспользуйся функцией Debug.Print или режимом Debug с наведением курсора на переменную.


Katerinishe

ещё вариант, если все записи в файле имеют одинаковое кол-во полей
Private Type zapis
 pole1 As String
 pole2 As ******
 pole3 As Date
End Type
Private Sub Command1_Click()
Dim buf As String
Dim mas() As String
Dim rec() As zapis

Dim rFF As Integer: rFF = FreeFile

Open "C:\TEXT.TXT" For Input As #rFF

Dim i As Long
Do Until EOF(rFF)
 ReDim Preserve rec(i)
 Line Input #rFF, buf
 mas = Split(buf, ";")
 rec(i).pole1 = mas(<b>0</b>)
 rec(i).pole2 = mas(<b>1</b>)
 rec(i).pole3 = mas(<b>2</b>)
 i = i + <b>1</b>
Loop

тут работаем с массивом rec состоящий из трёх полей
...

Close #rFF

End Sub