Использование FileSystemObject или оператора Input # для чтения данных из текстовых файлов - PullRequest
1 голос
/ 21 декабря 2010

Мне нужно прочитать некоторые данные из текстовых файлов, созданных, как в примере ниже, например, с 5 переменными, разделенными символом табуляции или пробелом (не столбцы фиксированной ширины)

Montreal 0.2 h 3 500
Otherplace 0.1 m 50 25
Thirdplace 0.05 m 62 112
[...]

Я мог бы прочитать их, используя инструкцию Input #, и это то, чем я в основном занимался, потому что это самый простой / ленивый подход.Но:

  • Оператор Input # не всегда распознает табуляцию как разделители.
  • Весь язык ввода Input # выглядит очень «устаревшим»!

Я думаю о модернизации и чтении файлов с использованием методов FileSystemObject (уже делаю это для записи файлов).

Но разве это не требует большого количества манипуляций со строками, чтобы разобрать мои 5 переменных значений?Любые предложения о том, как лучше всего это сделать?

Кроме того, как определить, сколько строк в текстовом файле?Так что я могу переопределить мои массивы заранее.

Ответы [ 4 ]

1 голос
/ 25 марта 2011

Подход FileSystemObject может работать примерно так:

Public Sub ReadLines()

Dim lines ' Variant, so it can take an array
Dim line ' Variant, to make For Each work nicely
Dim fields ' Variant to hold array of field values
Dim i As Integer

    With New FileSystemObject
        With .OpenTextFile("data.txt")
            lines = Split(.ReadAll, vbCrLf) ' assumes you have "normal" Windows line endings
        End With
    End With

    ' Now you can ReDim: UBound(lines) tells you how many records were read

    For i = 1 to UBound(lines)
        fields = Split(line(i), " ")
        CityNames(i) = fields(1)
        ' etc etc
    Next

End Sub

Если «ReDim my arrays» означает то, что я думаю, то я бы также подумал о создании Class или Type для хранениявходные данные и Collection (или Dictionary, поскольку у вас уже загружена среда выполнения сценариев) для хранения записей.

1 голос
/ 21 декабря 2010

Вместо INPUT # вы можете использовать LINE INPUT #, это будет читать всю строку.

Определение количества линий будет затруднено, потому что длина строки является переменной. Однако вы можете сделать обоснованное предположение, используя: Lines = LOF (Filehandle) / AvarageLineLength И вы можете динамически изменять размер вашего массива, используя REDIM PRESERVE

Использование Fileobject только добавит накладные расходы и зависимости к вашей программе. То же самое касается драйвера Jet. Это не так сложно написать функцию разделения строк? Поиск по сайту.

1 голос
/ 21 декабря 2010

Рассматривали ли вы использование Jet для чтения вашего текстового файла в качестве набора записей?

http://www.connectionstrings.com/textfile

Jet установлен во всех последних версиях Windows.

0 голосов
/ 25 марта 2011

Я решил использовать сочетание обоих подходов (FSO, стандартные команды BASIC).

Я использую FileSystemObject большую часть времени, поскольку он гибкий и простой в использовании. Это довольно стандартная вещь, поэтому я не слишком беспокоюсь о проблемах с зависимостями.

При чтении, например, элементы в таблицах, разделенных пробелами, по одному, я использую Input #, потому что писать не так быстро, и я избегаю необходимости разбирать строки

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