如何向Excel 2016中使用Power Query创建的合并表中添加列?

如何向Excel 2016中使用Power Query创建的合并表中添加列?,excel,powerquery,Excel,Powerquery,我有一个Excel 2016文件,其中有几个表,我使用Power Query将它们连接在一起。表中有一些日期字段填充为文本,例如1022018=2018年1月2日,我需要将它们转换为日期。我为每个添加了一列,可以很好地转换数据,但每次刷新查询时,新列都会消失 我打开了Power Query并尝试添加自定义列,但我在Excel中创建的公式不起作用,需要用M编写。我没有找到一种简单的转换为M的方法,也没有找到使用Excel公式创建列的其他方法 有没有办法做到这一点 供参考的公式是:=IFLEN[@D

我有一个Excel 2016文件,其中有几个表,我使用Power Query将它们连接在一起。表中有一些日期字段填充为文本,例如1022018=2018年1月2日,我需要将它们转换为日期。我为每个添加了一列,可以很好地转换数据,但每次刷新查询时,新列都会消失

我打开了Power Query并尝试添加自定义列,但我在Excel中创建的公式不起作用,需要用M编写。我没有找到一种简单的转换为M的方法,也没有找到使用Excel公式创建列的其他方法

有没有办法做到这一点


供参考的公式是:=IFLEN[@DOBstring]=7,DATERIGHT[@DOBstring],4,LEFT[@DOBstring],1,MID[@DOBstring],2,2,DATERIGHT[@DOBstring],4,LEFT[@DOBstring],2,MID[@DOBstring],3,2在Power Query中,使用以下公式创建自定义列:

= if Text.Length([Date])=7 then
  Text.Middle([Date],1,2)
    & "-"
    & "0"
    & Text.Start([Date], 1)
    & "-"
    & Text.End([Date],4) 
else
  Text.Middle([Date],2,2)
    & "-"
    & Text.Start([Date], 2)
    & "-"
    & Text.End([Date],4)
这将生成格式为dd mm yyyy的文本。根据您的区域设置,将此自定义列格式化为日期时,此值将转换为正确的日期值

否则,您将需要以下公式:

= if Text.Length([Date])=7 then 
  "0"
    & Text.Start([Date], 1)
    & "-"
    & Text.Middle([Date],1,2)
    & "-"
    & Text.End([Date],4)
else
  Text.Start([Date], 2)
    & "-"
    & Text.Middle([Date],2,2)
    & "-"
    & Text.End([Date],4)

如果我理解正确,输入字符串中的月份不是零填充的,这会导致输入字符串的长度为7或8

可能值得创建一个如下所示的小函数,它将处理不同的长度,然后尝试根据假定的字符位置解析日期

ParseDate = (someText as text) as date =>
        let
            zeroPadded = Text.End("0" & someText, 8),
            yearParsed = Text.End(zeroPadded, 4),
            monthParsed = Text.Start(zeroPadded, 2),
            dayParsed = Text.Middle(zeroPadded, 2, 2),
            dateParsed = #date(Number.From(yearParsed), Number.From(monthParsed), Number.From(dayParsed))
        in dateParsed,
然后,您可以在转换现有列或添加新列时调用它。举个例子:

let
    ParseDate = (someText as text) as date =>
        let
            zeroPadded = Text.End("0" & someText, 8),
            yearParsed = Text.End(zeroPadded, 4),
            monthParsed = Text.Start(zeroPadded, 2),
            dayParsed = Text.Middle(zeroPadded, 2, 2),
            dateParsed = #date(Number.From(yearParsed), Number.From(monthParsed), Number.From(dayParsed))
        in dateParsed,
    someTable = Table.FromColumns({{"1022018", "05242019", "12282026"}}, type table [toParse = text]),
    transformedColumn = Table.TransformColumns(someTable, {{"toParse", ParseDate, type date}}),
    addedColumn = Table.AddColumn(someTable, "parsed", each ParseDate([toParse]), type date)
in
    addedColumn
其中: