2016-11-22 18 views
-1

私は巨大なテキストファイルを持っています。約18000サンプルのテキストと、一貫した数の前方スラッシュで区切られています://////////////// //////vba/excelのテキストマイニングの有効なメソッド

Example: 

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

name: john 
age: 18 
hobbies: cycling, drawing 

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

たびにプログラムがこの言葉、新しい行を含む、Excelで作成された「見る」ように私は、「私のもの」という単語「サッカー」のため、このテキストファイルにしたいです被験者の名前、私はいくつかのコードを試みた(vba-優れ、アレイ内のテキストのすべてのチャンクの読み込み)を有する

 A   B   age 
1 P12/000894  eva   19 

上記コードが、TXTファイルがそうであるので大規模な、私のPCは、コードを実行するときに融解している。最善の方法上の任意のアイデア (VBAエクセル優先的に、PowerPivotの/ powerquery ??)

おかげ C

+3

あなたが持っているコードを投稿してください---それを投稿コードにエラーや問題がある場合は、このサイト(上記)にアクセスしてください。あなたのコードがエラーなく動作するが、パフォーマンスの改善とコメントを要求している場合は、[Codereview](http://codereview.stackexchange.com/)に投稿してください。 – PeterT

答えて

0

編集:videoは2つのアプローチを説明できるようになりました。 速いアプローチは以下のコードにあります。それは次のコードで行うことができますエクセル/パワークエリで

:ここ

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

こんにちは。コードには1つの重大な欠点があります:レコードごとに固定数のパラメータがあると仮定し、それらは固定された順序で来ます。 – Eugene

+1

@Eugene:よく観測されました!私のコードが動作するための前提条件は、パラメータの数と順序が固定されていなければならないということです。それは実際には限度であり、前提条件が満たされなければ、それはさらに悪いことです。利用される。 – MarcelBeug

+0

Marcel、一方で、Table.DistinctとTable.Pivotはリソースを大量に消費するため、大規模な(2M行)データセットの方が速く動作するようです。 – 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 
関連する問題