Excel - 查询CSV缺失列

时间:2016-02-08 18:16:52

标签: excel vba excel-vba csv powerquery

因此,我使用Office 2016的新查询功能从各种CSV API端点获取数据。我设法让它与Yahoo Finance合作,但我似乎无法让Morningstar工作。当我在浏览器中访问此链接时,我会下载包含所有正确数据的完整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参数;也许这可能会有所帮助?

3 个答案:

答案 0 :(得分:2)

额外值参数可以检索您的额外行(使用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文件只有一列。然后它根据逗号位置将行拆分为列,然后使第一行成为列名。

答案 1 :(得分:0)

请参阅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),
    ...

但是如果标题行已损坏,则可能无效。

答案 2 :(得分:0)

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

此代码返回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