Чтение в файле .CSV в VB6 и поиск максимального числового значения: - PullRequest
0 голосов
/ 28 декабря 2011

Я ужасно пытаюсь понять, как ввести файл .CSV, прочитать все данные, которые являются целыми числами, и просто найти максимальное значение файла.

Я закончил, открывая файл в Excel и выполняя вычисления в Excel, используя VB6. Однако я бы не хотел использовать какие-либо внешние программы.

Может кто-нибудь помочь объяснить, как открыть файл .CSV и прочитать запись данных в переменную.

Занимался этим часами, и это сводит меня с ума.

Я могу легко сделать остальное оттуда.

Спасибо, ребята / девочки ...

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011
Dim F As Long, d As Double, dMax As Double
F = Freefile
Open "file.csv" For Input As F
While Not Eof(F)
    Input #F, d
    If d > dMax Then dMax = d
Wend
Close F
MsgBox "Max is " & dMax

Это предполагает только один столбец в CSV. Используйте

Input #F, col1, col2, col3

и т. Д. ... для нескольких столбцов.

2 голосов
/ 28 декабря 2011

Jet Text IISAM может быть мощным инструментом для всех видов обработки файлов, содержащих табличный текст. Вы можете выполнять простые запросы, присоединяться к файлам, вставлять в запросы выражения службы выражений VBA, преобразовывать входной файл в другой формат вывода и многое другое.

Добавляя файл schema.ini, вы получаете более точный контроль над разделителями, именами столбцов, форматами типов данных, а также можете обрабатывать текст с фиксированным полем.

Для простого нахождения максимума столбца:

'Requires a reference to ADO 2.5 or later.

Private Function GetMax( _
    ByVal FieldNum As Integer, _
    ByVal CSVFile As String, _
    Optional ByVal CSVFolder As Variant) As Variant
    'Find max value in field FieldNum of CSVfile, assumed
    'here to be a HDR=No CSV file so field names are F1,
    'F2, etc.

    Dim rsResult As ADODB.Recordset

    If IsMissing(CSVFolder) Then
        CSVFolder = App.Path
    ElseIf VarType(CSVFolder) <> vbString Then
        CSVFolder = App.Path
    End If

    Set rsResult = New ADODB.Recordset
    With rsResult
        .CursorLocation = adUseClient
        .Open "SELECT Max(F" & CStr(FieldNum) & ") FROM [" & CSVFile & "]", _
              "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" _
              & CSVFolder _
              & "';Extended Properties='Text;HDR=No'", _
              adOpenStatic, adLockReadOnly, adCmdText
        GetMax = .Fields(0).Value
        .Close
    End With
End Function

Хотя это может показаться излишним, считайте его «зародышем» многих других идей обработки текстовых таблиц.

Это так же эффективно и полезно в VBScript, как и в VB.

См. Обработка текстовых баз данных для получения дополнительной информации.

1 голос
/ 28 декабря 2011

Похоже, корень вашей проблемы - чтение файла по очереди.Я бы использовал Scripting.FileSystemObject http://support.microsoft.com/kb/186118, чтобы сделать эту работу.Его гораздо проще использовать, чем встроенный оператор Input.Вот некоторый код с этой страницы:

Private Sub Command1_Click()
   'Declare variables.
    Dim fso As New FileSystemObject
    Dim ts As TextStream
    'Open file.'
    Set ts = fso.OpenTextFile(Environ("windir") & "\system.ini")
   'Loop while not at the end of the file.'
    Do While Not ts.AtEndOfStream
        Debug.Print ts.ReadLine
    Loop
    'Close the file.'
    ts.Close
End Sub

Получив строку текста, используйте Split, чтобы получить массив значений, а затем осмотрите каждый из них, чтобы убедиться, что он числовой.Если это так, включите значение в ваш поиск для максимума.Посмотрите этот вопрос, чтобы найти некоторые решения аналогичного вопроса, который также может помочь: Есть ли функция VB6, аналогичная функции sscanf в C?

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