Как найти в текстовом файле несколько подходящих строк и поместить значение суммы в ячейку Excel - PullRequest
0 голосов
/ 04 июля 2018

Это, вероятно, достаточно просто - я пытаюсь написать код VBA, который будет проходить через заданный текстовый файл, сопоставлять значения для данной строки и затем добавлять его в ячейку в моей электронной таблице Excel.

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

Это пример кода, который я написал до сих пор -

Dim myFile As String, text As String, textline As String

myFile = "C:\Support\test\input.txt"

Open myFile For Input As #1
Do Until EOF(1)
    Line Input #1, textline
    text = text & textline
Loop
Close #1

'FEATURES
FeatureA = InStr(text, "FEATURE_A")
FeatureB = InStr(text, "FEATURE_B")
FeatureC = InStr(text, "FEATURE_C")

Range("a1").Value = Mid(text, FeatureA + 9, 3)
Range("a2").Value = Mid(text, FeatureB + 9, 3)
Range("a3").Value = Mid(text, FeatureC + 9, 3)

End Sub

Полагаю, мне нужно, чтобы он зациклился, чтобы сложить значения вместе, но не уверен, как это сделать. Поэтому, если набор данных выглядит так, как показано ниже, в данный момент мой код подберет первое совпадение и поместит это значение в ячейку, он не будет продолжаться в остальной части списка. Для Feature_C будет выбрано только «4» в качестве значения, в отличие от добавления всех значений, которые он находит для соответствующей строки (4 + 9)

Пример txt -

FEATURE_A 1
FEATURE_B 4
FEATURE_C 4
FEATURE_C 9

Надеюсь, что это имеет смысл, и заранее спасибо за помощь / предложения.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Это довольно элементарный шаблон RegEx, но он соответствует вашим требованиям к образцу.

Sub Macro3()
    Dim myFile As String, txt As String, txtl As String
    Dim i As Long, features As Variant

    myFile = "C:\test\input.txt"

    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, txtl
        txt = txt & txtl
    Loop
    Close #1

    features = Array("FEATURE_A", "FEATURE_B", "FEATURE_C")

    With Worksheets("sheet2")
        For i = LBound(features) To UBound(features)
            .Cells(1, "A").Offset(i, 0).Resize(1, 2) = _
                Array(features(i), sumFeatures(CStr(features(i)), txt))
        Next i
    End With

End Sub

Function sumFeatures(f As String, t As String) As Double
    Dim n As Long
    Static rgx As Object, cmat As Object

    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If

    sumFeatures = 0

    With rgx
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = f & " \d"
        If .Test(t) Then
            Set cmat = .Execute(t)
            'sum the matches
            For n = 0 To cmat.Count - 1
                sumFeatures = sumFeatures + _
                    CDbl(Replace(cmat.Item(n), f, vbNullString, 1, 1, vbTextCompare))
            Next n
        End If
    End With

End Function

FEATURE_A   1
FEATURE_B   4
FEATURE_C   13
0 голосов
/ 04 июля 2018

Нет реальной необходимости в VBA. В Excel 2010+ вы можете использовать Power Query (AKA Get&Transform в 2016 году). И все это можно сделать через графический интерфейс

  • Определите свой источник
  • Группировка строк по столбцу 1

    • Столбец суммы 1
  • Объединить два столбца с пробелами в качестве разделителя

Вот код M, но, как я уже писал выше, вы можете сделать это с помощью редактора Power Query Editor:

let
    Source = Csv.Document(File.Contents("C:\Users\Ron\Desktop\Input.txt"),2,"",null,1252),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Column1"}, {{"Count", each List.Sum([Column2]), type number}}),
    #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Grouped Rows", {{"Count", type text}}, "en-US"),{"Column1", "Count"},Combiner.CombineTextByDelimiter("   ", QuoteStyle.None),"Feature Sums")
in
    #"Merged Columns"

Теперь у вас есть запрос, который вы можете неоднократно применять к файлу. Либо «обновить», если новые данные добавляются, либо заменить, если это то, что вы хотите сделать.

enter image description here

0 голосов
/ 04 июля 2018

Похоже, вам нужна функция для подсчета вхождений подстроки.

Function CountOccurences(ByVal Text As String, ByVal SearchString As String) As Long
    Dim length As Long
    length = Len(Text) - Len(Replace(Text, SearchString, ""))
    CountOccurences = length / Len(SearchString)
End Function
...