【问题标题】:Excel - Query for CSV missing columnsExcel - 查询 CSV 缺失列
【发布时间】:2016-02-08 18:16:51
【问题描述】:

所以我正在使用 Office 2016 的新查询功能从各种 CSV API 端点获取数据。我设法让它与雅虎财经合作,但我似乎无法让晨星公司工作。当我在浏览器中访问此链接时,我会下载包含所有正确数据的完整 CSV:

链接:http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=MSFT&reportType=is&period=12&dataType=A&order=asc&columnYear=10&number=3

但是,当我使用查询功能时,它只加载第一行。我猜这是因为只有 CSV 第一行中的第一列有数据,导致它忽略了其余的列。有谁知道如何忽略第一行并从第二行开始导入 CSV?

let
    Source = Csv.Document(Web.Contents("http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=MSFT&reportType=is&period=12&dataType=A&order=asc&columnYear=10&number=3"),[Delimiter=",",Encoding=1252])
in
    Source

提前致谢!

编辑:在 Csv.Document 中,看起来有一个 extraValues 参数;也许这可能会有所帮助?

【问题讨论】:

    标签: vba excel csv powerquery


    【解决方案1】:

    额外的值参数可以检索您的额外行(使用 ExtraValues.List),但表格的形状将难以使用。

    这是获取值的一种方法:

    let
        Source = Table.FromColumns({Lines.FromBinary((Web.Contents("http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=MSFT&reportType=is&period=12&dataType=A&order=asc&columnYear=10&number=3")),null,null,1252)}),
        #"Removed Top Rows" = Table.Skip(Source,1),
        #"Split Column by Delimiter" = Table.SplitColumn(#"Removed Top Rows","Column1",Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv),{"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7"}),
        #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Column1.1", type text}, {"Column1.2", type text}, {"Column1.3", type text}, {"Column1.4", type text}, {"Column1.5", type text}, {"Column1.6", type text}, {"Column1.7", type text}}),
        #"Promoted Headers" = Table.PromoteHeaders(#"Changed Type")
    in
        #"Promoted Headers"
    

    此查询将 CSV 文件视为行的文本文档。它删除了第一行,这是一些标题语句,导致解析器认为 CSV 文件只有一列。然后它根据逗号位置将行拆分为列,然后将第一行作为列名。

    【讨论】:

      【解决方案2】:

      https://msdn.microsoft.com/en-us/library/mt260840.aspx?f=255&MSPPError=-2147217396:

      let
      
      Source = Csv.Document(File.Contents("C:\Projects\Examples\SalesForceContacts.txt"),
          [Delimiter=",",Encoding=1252]),
          #"First Row as Header" = Table.PromoteHeaders(Source),
          ...
      

      但如果标题行损坏,这可能不起作用。

      【讨论】:

      • 虽然这提升了标题,但我仍然缺少所有其他列!我想是因为提升是在读取数据之后发生的,所以不会影响我能拿到什么数据。
      【解决方案3】:

      除非您明确指定列数,否则将使用第一行确定。 由于示例的第一行仅包含第一列中的值,因此结果表也仅包含一个。

      此代码返回 7 列:

      let
          Source = Web.Contents("http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=MSFT&reportType=is&period=12&dataType=A&order=asc&columnYear=10&number=3"),
          Csv = Csv.Document(Source,[Delimiter=",", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None])
      in
          Csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多