-1

一定数のスラッシュで区切られた約 18,000 のテキスト サンプルで構成される巨大なテキスト ファイルがあります: ////////////////////

Example:

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

name: john
age: 18
hobbies: cycling, drawing

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

このテキスト ファイルで「soccer」という単語を「マイニング」して、プログラムがこの単語を「見る」たびに、件名と上記のコードを含む新しい行が Excel で作成されるようにします。

      A            B           age
1 P12/000894       eva         19

いくつかのコード (vba-excel、テキストのすべてのチャンクを配列に読み込む) を試しましたが、txt ファイルが非常に大きいため、コードを実行すると PC が溶けてしまいます。最善の方法に関するアイデア (優先的に vba-excel、powerpivot/powerquery??)

ありがとうC

4

2 に答える 2

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
于 2016-12-02T02:14:54.790 に答える
0

編集: 2 つのアプローチを説明するビデオが利用可能になりました。高速なアプローチは、以下のコードにあります。

Excel / Power 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
于 2016-11-23T06:11:53.327 に答える