【问题标题】:Skip 6 rows before "reading" into powerquery在“读取”到电源查询之前跳过 6 行
【发布时间】:2016-09-16 15:34:39
【问题描述】:

我正在尝试自动化一些基于 Netsuite(我们的 ERP 软件)导出的 CSV 的报告。这些文件永远不会正确直接导入 PowerQuery,因为有 6 行是“标题”行。这些标题行没有正确数量的逗号,因此 PowerQuery 仅显示 1 列数据。我目前正在使用 Notepad++ 打开文件并删除这 6 行,然后将文件导入 PowerQuery。

有没有办法使用 PowerQuery 代码跳过前 6 行,以便正确读取 csv?以下是我正在处理的数据示例。

Fake Cocoa Company LLC
"Fake Cocoa Company, LLC (Consolidated)"
Sales Order Detail - Hotel - BH
"January 1, 2016 - December 31, 2016"

"Options: Show ZerosFilters: Customer/Project (equal to FCC - Hotel Hotel ), Validated Status (not equal to Cancelled, Closed )"
Document Number ,Date ,Ship To ,Item: Description (Sales) ,Quantity ,Validated Status ,Unit Price ,Aggregate Amount 
Sales Orders,,,,,,,
669,9/15/2016,Receiving - CCLV Hotel 2880 Some Place Blvd South Hotel Hotel Some Place CA 91089,100% Country Caf  Liquid Cocoa,5,Billed,$75.68,$378.40
660,,,,,,,
,9/15/2016,Receiving - MAIN OCEAN Hotel 4300 Some Place Blvd SO Some Place CA 91089,100% Country Caf  Liquid Cocoa,10,Billed,$7.68,$75.80
,9/15/2016,Receiving - MAIN OCEAN Hotel 4300 Some Place Blvd SO Some Place CA 91089,Fake Cocoa Grand - Whole Bean 5/5LB,8,Billed,$17.80,$72.00
,9/15/2016,Receiving - MAIN OCEAN Hotel 4300 Some Place Blvd SO Some Place CA 91089,Fake Cocoa Grand 28/9oz,6,Billed,$5.54,$39.24
,9/15/2016,Receiving - MAIN OCEAN Hotel 4300 Some Place Blvd SO Some Place CA 91089,Fake Cocoa Grand 42/2oz,4,Billed,$1.32,$7.28
,9/15/2016,Receiving - MAIN OCEAN Hotel 4300 Some Place Blvd SO Some Place CA 91089,Fake Cocoa Caf - Whole Bean 5/5LB,2,Billed,$2.80,$28.00
Total - 660,,,,,,,"$203.32"

【问题讨论】:

    标签: excel csv powerpivot powerquery


    【解决方案1】:

    使用原生 CSV PowerQuery 解析器

    let
        file_path = "C:\your_path\csv.txt",
        file = File.Contents(file_path),
        src = Lines.FromBinary(file),
        skip = List.Skip(src,6),
        combine = Text.Combine(skip, "#(lf)"),
        csv = Csv.Document(combine),
        promote = Table.PromoteHeaders(csv)
    in
        promote
    

    【讨论】:

      【解决方案2】:

      table.skip可以为所欲为

      第二个参数可以是数字(例如6)或条件(例如(#"Position of ""Options: Show ZerosFilters: Customer/Project (equal to FCC - Hotel Hotel ), Validated Status (not equal to Cancelled, Closed )""" + 1)

      【讨论】:

      • 感谢您的提示 - 知道一个人也可以通过条件非常有用!在这里为我工作的代码是:Table.Skip(Source, List.PositionOf(Source[Column1], """Options: Show ZerosFilters: Customer/Project (equal to FCC - Hotel Hotel), Validated Status (not equal to已取消,已关闭 )""") + 1)。首先将所有数据读入名为“Column1”的列中。转义 " 有点特别。
      【解决方案3】:

      问题是您尝试在 Power Query 中“从 CSV”导入 CSV 作为源。具有描述内容的第一行将破坏自动转换。因此,为了防止这种情况,您必须以另一种方式将文件导入 PQ。 Ken 的Excelguru Blog 很好地描述了这个问题(顺便说一句:我热烈推荐他的书)。

      代码如下:

      let
          /* Get the raw line by line contents of the file, preventing PQ from interpreting it */
          fnRawFileContents = (fullpath as text) as table =>
          let
              Value = Table.FromList(Lines.FromBinary(File.Contents(fullpath)),Splitter.SplitByNothing())
          in Value,
      
          /* Use function to load file contents */
          Source = fnRawFileContents("D:\yourfile.csv"),
          #"Removed Top Rows" = Table.Skip(Source,6),
          #"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", "Column1.8"}),
          #"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}, {"Column1.8", type text}}),
          #"Promoted Headers" = Table.PromoteHeaders(#"Changed Type")
      
      in
          #"Promoted Headers"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多