2016-11-22 42 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- Excel中,读取文本的每一个块到一个数组),但由于txt文件是如此大,我的电脑在运行代码时正在融化。 上的最佳方法的任何想法(VBA-Excel的优先,PowerPivot的/ powerquery ??)

由于 Ç

+3

请张贴你的代码---它张贴在这个网站(上面)如果代码有错误或问题。如果您的代码没有错误地工作,但您要求改进性能和评论,请将其发布到[Codereview](http://codereview.stackexchange.com/)上。 – PeterT

回答

0

编辑:一个video现已说明2点的方法。 快速方法在下面的代码中。

在Excel /功率查询也可以用下面的代码来完成:

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

@Eugene:很好的观察!所以我的代码工作的一个先决条件是参数的数量和顺序必须是固定的,这是一个限制的确如此,如果前提条件没有得到满足,这也是一个缺点,甚至更糟糕:在这种情况下,我的代码不能使用。 – 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