geyee

第 73 位会员
注册于 2018-08-29 21:45:03
活跃于 2020-04-09 10:42:20


  • 百度接口 进行文本分析 GBK 格式转换错误 at 2019-10-10 23:05:20

    查看 百度nlp词法分析接口文档 ,需要 post 方法提交 json 格式的数据向带有 access_token 的指定网址,access_token 由发送带有 apikey(client_id)和 secretkey(secret_id)的指定网址的请求返回的json数据取得。
    前者可以添加 charset=UTF-8 参数以 utf-8 格式来 post utf-8 格式的 json 数据,而其默认是 gbk 编码的。返回的数据依然是json格式,故有——

    
    (wb) =>
    
    let
         token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=*&client_secret=*",
         token_headers = [#"Content-Type"="application/json; charset=UTF-8"],
         token = Json.Document(Web.Contents(token_url))[access_token],
         text_url = "https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer?access_token="&token,
         text_headers = [#"Content-Type"="application/json"],
         text_content = "{""text"":"""&wb&"""}",
         result=Json.Document(Web.Contents(text_url,[Content=Text.ToBinary(text_content, 936)]), 936)
    in
         Table.FromRecords(result[items])


    其中,text_url对应的可以改成 "https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer?charset=UTF-8&access_token="&token , 以及 result 改为 Json.Document(Web.Contents(text_url,[Content=Text.ToBinary(text_content)])) 。

    继而想到 utf-8 与 gbk 编码解码的问题,看样子暂时用不到 Uri.EscapeDataString 。
    *星号需要替换一下自己申请得来的百度AI开放平台相应应用(如 产品服务 / 自然语言处理 - 应用列表 / 应用详情 下的)的值,自不必说。

  • 网抓 网址请求方式为 post,已找到数据,研究半天没成功抓取到。求解 at 2019-09-05 18:15:14

    @绿夏 用户分析数据接口需要通过开发者中心页(微信公众平台=》开发=》接口权限)->用户管理下开通相应接口权限,但开通用户管理接口需要微信认证,微信认证个人公众号不给办(账号主体为个人), 否则返回48001全局返回码。试写自定义函数如下:

    (ACCESS_TOKEN)=>  
    let 
       bin=Web.Contents("https://api.weixin.qq.com/datacube/getusersummary?access_token="&ACCESS_TOKEN,[Content=Text.ToBinary(datejsontext)]),
        datejsontext = "{   ""begin_date"": ""2014-12-02"",   ""end_date"": ""2014-12-07"" }"
    in  
       Json.Document(bin)
  • 数据处理问题 at 2019-09-05 14:43:27

    如果规则2只处理仅有一个空行的话,还是可以用List.Accumulate,否则的话可能需要借助索引等辅助,走分组标记子查询的方法。

    let
        源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("Zc3BDcMwCAXQXThH6IMN2At0hR4s779GsFslUSv5APjr/TFIRToUqEYHvV/SHRBFLhbsKDlorzkWmsegXD9PQo0r9vEy/GtEGtCVMta25E3ED1HyN26hAlZvAa2tkHPrvgvDGI9CAUr8xdl3H815Ag==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [销售合同号 = _t, 外销发票号 = _t, 重量 = _t, #"分摊金额(含税)" = _t]),
        tlist = List.RemoveLastN(Table.ToRows(源),0),
        转换 = List.Accumulate(tlist,{},(s,c)=>if Text.Length(c{2})<=1 then List.RemoveLastN(s)&{List.RemoveLastN(List.Last(s))&{List.Sum(List.Transform({List.Last(List.Last(s)),c{3}},Number.From))} } else s&{c}),
        转换2 = List.Accumulate(转换,{},(s,c)=>if Text.Length(Text.From(c{3}))<=1 then 
                  List.RemoveLastN(s) & { List.RemoveLastN(List.Last(s)) & { Number.From( List.Last(s){2} ) / List.Sum( List.Transform({ List.Last(s){2}, c{2} }, Number.From) ) * Number.From(List.Last(s){3}) } } & {List.RemoveLastN(c)&{   Number.From(c{2}) / List.Sum(List.Transform({List.Last(s){2}, c{2} },Number.From) ) * Number.From(List.Last(s){3})} }  else s&{c}),
        result = Table.FromRows(转换2,Table.ColumnNames(源))
    in
        result

    file

  • M 语言-隔行提取某列中的信息并转至表格 at 2019-09-03 21:05:13

    如果是按第二列,每三行一组,然后三行变三列再加上分组的列,如下显示

    let
        源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMs7JLElV0skrzcmJ1YlW8krMy84vy0xW0lHyzcxJzFMCCQYUZeYlZxYk5iDUoWnzTSwqzkjMASpQck/NT0srSq2E6EwsKslLLcKuLxYA"),Compression.Deflate)),let _t = ((type text) meta [Serialized.Text = true]) in type table [Column1.1 = _t, Column1.2 = _t]),
        三行拆分 = List.Transform(Table.Split(源,3),each #table({"Column1.2","col2","col3","col4"},{List.FirstN(List.Combine({{_[Column1.2]{1}?}, _[Column1.1]&{null,null}}),4)})),
        合并 = Table.Combine(三行拆分)
    in
        合并  

    file

    再次分析题主的意思,估计是按第一列3开头的为分组开始拆分,则首列可变为
    = List.Accumulate(源[Column1.1],{""},(s,c)=>if Text.At(c,0)="3" then s&{{c}} else List.RemoveLastN(s,1)&{List.Last(s)&{c}}),进而有

    let
        源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dY1BCoRADAT/kvPcfIS4MKCehMFDcKMGQ0biKPj7VRSEBY/dVHWHAJlwInC6irQuwAd1iht34MCzoMJZlsba8YzycH+aR1tGlAOAnGLfG+2XiZaU7NXLfNE8qVp31OHYqOP9Swt/SdONtD8="),Compression.Deflate))),
        合并列 = Table.CombineColumns(源,Table.ColumnNames(源),each Text.Combine(_,"-"),"合并"),
        分组 = List.Skip(List.Accumulate(合并列[合并],{""},(s,c)=>if Text.At(c,0)="3"  then s&{{c}} else List.RemoveLastN(s,1)&{List.Last(s)&{c}})),
        修正 = List.Transform(分组,each  if List.Count(_)<3 then  List.FirstN(_&{null,null},3) else _),
        转换 = Table.FromRows(修正,{"Col1","Col2","Col3"}),
        按分隔符拆分列 = Table.SplitColumn(转换, "Col2", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Col2.1", "Col2.2"}),
        更改的类型 = Table.TransformColumnTypes(按分隔符拆分列,{{"Col2.1", type text}, {"Col2.2", type text}})
    in
        更改的类型

    file

  • 如何在表格的文本中 计算金额合计 at 2019-09-03 15:17:45

    该题识别为提取数字,不含小数点及千分位符等,可以考虑引入Web.Page正则查找等。其他解决方案可能用到Splitter.SplitTextByAnyDelimiter,Character.FromNumber,List.Accumulate,Expression.Evaluate等函数。一个适用部分情况的简单的解答为

     let
        源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSjRU0lF6umn2846NTzs2PNm7wNjgaWvz+z09z2e1PF2y/OWM/U83THk6tcsEJKwUqwPUYQTU8Xz5+qcdbeYGMMUbdz9tXfF8QrOlhTlQ5HFDE0SpMVDpy0XtQCOAip7s7Hg6dZmZqbkJRNOTPb0vN7eYmcENNgGqfrZm+dMVjUDy2bR2MyMDHCpNgSpfrN8GdN3L9h5DA4iV4fmZqUYQZ8YCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [类型1 = _t, 数据 = _t]),
        求和 = Table.AddColumn(源, "合计", each List.Sum(List.Transform(Text.SplitAny([数据], Text.Remove([数据],{"0".."9"})),Number.From)))  
     in
        求和

    思路为字符按汉字、标点符号及其他除数字外的特殊符号的任意字符拆分,然后转换为数字再求和。
    其他情形,如有小数点等可能PQ表达式就复杂些。

  • power pivot 中无法将类型为 “system.——comobject” 的 com 对象强制转换为接口类型 at 2019-08-22 12:39:12

    1. windows下IID(the Interface ID,为GUID)为{000208D5-0000-0000-C000-000000000046}的查询接口对应的是Microsoft.Office.Interop.Excel.dll文件(从ILSpy.exe查看知道),一个可能的路径为 C:\Program Files\Microsoft Office\root\Office16\ADDINS\PowerPivot Excel Add-in\Microsoft.Office.Interop.Excel.dll。

    2.可能是注册表残留先前版本的office文件信息,注册表定位到计算机\HKEY_CLASSES_ROOT\Interface{000208D5-0000-0000-C000-000000000046}下,查看typelib下 Version值及对应的默认LIBID值(the Type Library ID),可能的值为 {00020813-0000-0000-C000-000000000046}。进而计算机\HKEY_CLASSES_ROOT\TypeLib{00020813-0000-0000-C000-000000000046}下,查看是否有多个条目(值可能在1.0~1.9之间,或更高)(值1.9对应的是Microsoft Excel 16.0 Object Library(MS Excel 2016)),删除或重命名与先前找到的Version值不同的项。

    3.猜测是这样,类型为System.__ComObject的Com对象进行强制转换时找不到对应版本的文件(注册表无相应项、值,或有值但无对应的dll文件),才发生该错误,产生库没有注册的提示。修正对应的注册表项,或者重新安装正确的版本一般能解决问题。

    参考

    ①.COM IDs & Registry keys in a nutshell

    ②.How to solve "Unable to cast COM object of type 'Microsoft.Office.Interop.Excel.ApplicationClass' to interface type 'Microsoft.Office.Interop.Excel._Application'"

    ③.无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的COM 对象强制转换为接口类型“Microsoft.Office.Interop.Excel._Application”

    ④.Office“库没有注册”问题

    ⑤.Office automation when multiple versions of Office are installed

  • 从 MySQL 云服务器获取数据提示 缺少 Renci.SshNet 文件而无法链接 at 2019-08-21 20:56:31

    搜索 An error happened while reading data from the provider: 'Could not load file or assembly 'Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken= 得知,一般是MySQL Connector版本的问题。云服务器什么版本,更换对应的版本看看,是使用.net还是odbc驱动?

  • 请问 DAX 函数手册里面提到的一些案例表格在哪里下载? at 2019-08-21 15:42:45

    《DAX in the BI Tabular Model Whitepaper and Samples》对应有Contoso DAX Formula Samples.zip,
    在https://docs.microsoft.com/en-us/dax/data-analysis-expressions-dax-reference 下搜到Contoso Sales for Power BI Designer.zip,或者谷歌到Contoso Sales Sample for Power BI Desktop.zip,基本包含部分相同的表名,但都不是最准确的dax sample files。

    考察Dax函数手册里的ProductInventory表名,搜索找到AdventureWorks关键词,对应的数据仓库里有对应的表名,估计下载https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks 然后搭建SQL Server,就可以拉取相应的表格了。另一个有用的数据集/数据样本链接是https://docs.microsoft.com/en-us/power-bi/sample-datasets。

  • 当 powerquery 遇上受保护的视图? at 2019-08-21 14:08:04

    看到Alex、飞天篮球两位大神的答案,便又搜索一番研究了一下该问题。「受保护的视图」一般是从网上下载的文档,由于office选项里设置里相应选项为启用状态,打开后便显示受保护了。先前,从网络上下载chm格式文件打开显示空白,office文档打开失败、无法解析、被占用或者空白,或者受保护的视图启用编辑再修改后只能另存,这些多半是文件被锁定的症状。如何解决下载的网络文件被锁定的这个问题,一则可以手动设置取消启用,或者修改组策略、注册表等,二则用第三方软件实现。一般从IE、Chrome等浏览器下载的网络文档,在NTFS分区下,都附加交换数据流(备用数据流),针对Alternate Data Streams, 考虑一个名为unblock_file的自定义pq函数(利用Web.Page解析Jscript)重写Zone.Identifier,如下

    unblock_file=let
        源 = (filepath as text) => let
        escape_path=Text.Replace(filepath,"\","/")&"/",
        源 = Folder.Files(escape_path),
        筛选的行 = Table.SelectRows(源, each ([Extension] = ".xls" or [Extension] = ".xlsx")),
        filepathName = Text.Combine(List.Transform(List.Transform(List.Zip({筛选的行[Folder Path],筛选的行[Name]}),Text.Combine),each Text.Replace(_,"\","/")),"|"),                                             // 获取文件绝对路径名并合并为文本字符串; 
        remove_ads = Web.Page("<script> 
                                  var fso = new ActiveXObject('Scripting.FileSystemObject');
                                  var arr = '"&filepathName&"'.split('|');
     for (var i=0;i<arr.length;i++){                             //Bulk rewrite Streams
        var fullpath= arr[i]+':Zone.Identifier';
        var ex=fso.FileExists(fullpath);
        if (!ex) {continue;}          //跳过没有ads的文件
        var f=fso.CreateTextFile(fullpath);
        f.WriteLine('[ZoneTransfer]' + '\r\n' + 'ZoneId=2');
        f.Close();
    document.write(fullpath)}
    document.write('\r\nover')
    
                              </script>"),
        bodytext= Table.Buffer(remove_ads{0}[Data][Children]{0}{1}[Children]),
        parseTable = if bodytext is table then Table.TransformColumns(筛选的行,{"Content",each Excel.Workbook(_)[Data]{0}}) else "error"
        in
            parseTable
          //remove_ads
           // bodytext
    in
        源
    
    //fileName = Text.Combine(筛选的行[Name],","),                                             
    //myfilepath = "D:\\My\ Documents\\whitespace\\path\\",  //路径需要转义,注意空格的转义
    //var fullpath= "& "'"& escape_path & "'"&" +arr[i]+':Zone.Identifier';

    在cmd命令提示符下,可以用notepad或者more<读取ads,通过dir /r可以查看目录下是否有:Zone.Identifier:$DATA标识的备用数据流文件,微软也提供了Sysinternals Stream工具修改或删除交换数据流。PowerShell的Remove-Item或Unblock-File也能批量解除ADS设置导致的文件锁定。当然还有其他软件支持类似操作,搜索一下就清楚了。图示为非自定义函数下的操作,

    file