2016-11-22 8 views
-1

У меня есть огромный текстовый файл, состоящий из 18 000 образцов текста, разделенных последовательным числом пересылаемых слайсов: ////////////// //////эффективный метод для интеллектуального анализа текста в vba/excel

Example: 

//////////////////// 
P11/000568 

name: john 
age: 18 
hobbies: cycling, drawing 

//////////////////// 
P12/000894 
name: eva 
age: 19 
hobbies: football, soccer, baseball 

Я хочу «мой» это текстовый файл, для слова «футбол», так что каждый раз, когда программа «видит» это слово, новая линия создается в Excel, содержащего название предмета и код выше

 A   B   age 
1 P12/000894  eva   19 

Я попытался код (vba- первенствует, чтение в каждой порции текста в массив), но так как текстовый файл так большой, мой компьютер тает при запуске кода. Любые идеи о лучшем способе (VBA-Excel предпочтительно, PowerPivot/powerquery ??)

Благодаря C

+3

Пожалуйста, пост код у вас есть --- разместить его на этом сайте (выше), если код имеет ошибки или проблему. Отправьте его на [Codereview] (http://codereview.stackexchange.com/), если ваш код работает без ошибок, но вы запрашиваете улучшения производительности и комментарии. – PeterT

ответ

0

Edit: а video теперь доступен объясняя 2 подхода. Быстрый подход приведен в приведенном ниже коде.

В Excel/Мощность Query это можно сделать с помощью следующего кода:

let 
    Source = Excel.CurrentWorkbook(){[Name="Input"]}[Content], 
    Typed = Table.TransformColumnTypes(Source,{{"Text", type text}}), 
    RemovedBlankRows = Table.SelectRows(Typed, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null}))), 
    Combined = Table.FromColumns({List.Skip(RemovedBlankRows[Text],4),List.Skip(RemovedBlankRows[Text],1),List.Skip(RemovedBlankRows[Text],2),List.Skip(RemovedBlankRows[Text],3)},{"Original","Code","Name","Age"}), 
    Filtered = Table.SelectRows(Combined, each Text.Contains([Original], "soccer")), 
    Removed = Table.RemoveColumns(Filtered,{"Original"}), 
    Transformed = Table.TransformColumns(Removed, {{"Name", each Text.RemoveRange(_, 0, 6), type text},{"Age", each Int64.From(Text.RemoveRange(_, 0, 5)), Int64.Type}}) 
in 
    Transformed 
+0

Привет. У вашего кода есть один серьезный недостаток: вы предполагаете, что на каждую запись записано фиксированное количество параметров, и они поступают в фиксированном порядке. – Eugene

+1

@ Юджин: хорошо видно! Поэтому обязательным условием для работы моего кода является то, что число и порядок параметров должны быть исправлены. Это действительно ограничение, и, если предварительное условие не выполняется, это также является недостатком, даже хуже: в этом случае мой код не может использоваться. – MarcelBeug

+0

Marcel, с другой стороны, кажется, что он работает быстрее, чем мой на большом (2M строк) наборе данных, как Table.Distinct и Table.Pivot очень ресурсоемкие. – Eugene

0

Вот то, что вы хотите в PowerQuery:

let 
    //Delimiter is REQUIRED, Default of "," messes the table! 
    Source = Csv.Document(File.Contents("C:\Users\Eugene\Desktop\test.txt"),[Delimiter="`", Columns=1, Encoding=1251, QuoteStyle=QuoteStyle.None]), 
    Split = Table.SplitColumn(Source,"Column1",Splitter.SplitTextByEachDelimiter({":"}, QuoteStyle.Csv, false),{"Parameter", "Value"}), 
    FilteredExcessiveRows = Table.SelectRows(Split, each ([Parameter] <> "" and [Parameter] <> "////////////////////")), 
    AddCode = Table.AddColumn(FilteredExcessiveRows, "Code", each if _[Value] = null then _[Parameter] else null), 
    FillDown = Table.FillDown(AddCode,{"Code"}), 
    RemoveDuplicates = Table.Distinct(FillDown, {"Code", "Parameter"}), 
    Filtered2 = Table.SelectRows(RemoveDuplicates, each ([Value] <> null)), 
    Pivot = Table.Pivot(Filtered2, List.Distinct(Filtered2[Parameter]), "Parameter", "Value"), 
    Filtered3 = Table.SelectRows(Pivot, each Text.Contains([hobbies], "soccer")), 
    RemoveHobbies = Table.RemoveColumns(Filtered3,{"hobbies"}) 
in 
    RemoveHobbies