电源查询-区域设置

我为我的部门制作了一个最佳实践表,该表可以在我自己的计算机上完美运行(美国地区设置),但是当我将其发送给同事时,一切都崩溃了(da-DK区域设置)。

该部门有一半使用en-US,另一半使用da-DK。并非所有人都可以使用相同的选项,因此我想创建一个可以自动处理这两种情况的工作表。

在美国创建的csv文件使用“,”定界符和“。”。代表十进制,而da-DK设置使用“;”作为分隔符,“,”代表小数。

我最好如何解决这个问题?

我有以下两个相同的数据查询

Data1.csv:

    Panel/Node/Case,MXX (knm/m),MYY (knm/m)
    1/ 1/ 1,145.46,145.46  
    1/ 1/ 2,98.83,98.83   
    1/ 1/ 3 (C),244.30,244.30  
    1/ 2/ 1,19.80,19.80   
    1/ 2/ 2,13.46,13.46   
    1/ 2/ 3 (C),33.26,33.26   
    1/ 3/ 1,19.80   
    1/ 3/ 2,13.46   
    1/ 3/ 3 (C),33.26   
    1/ 4/ 1,145.46  
    1/ 4/ 2,98.83   
    1/ 4/ 3 (C),244.30

Data2.csv:

    Panel/Node/Case;    MXX (knm/m);    MYY (knm/m)
    1/ 1/ 1;            145,46;         145,46
    1/ 1/ 2;            98,83;          98,83
    1/ 1/ 3 (C);        244,30;         244,30
    1/ 2/ 1;            19,80;          19,80
    1/ 2/ 2;            13,46;          13,46
    1/ 2/ 3 (C);        33,26;          33,26
    1/ 3/ 1;            19,80
    1/ 3/ 2;            13,46
    1/ 3/ 3 (C);        33,26
    1/ 4/ 1;            145,46
    1/ 4/ 2;            98,83
    1/ 4/ 3 (C);        244,30

我当时正在考虑使用替换值函数来替换我需要的字符,但是由于两个查询都包含一个“,”,因此非常困难。

dubofengmvp 回答:电源查询-区域设置

也许有一些动态/内置的方法可以检测文件内容的语言环境和定界符。我还没有找到。在有人提出并提出更好的方法之前,也许以下内容可以作为临时解决方案。

  • 下面的代码中的parseCsv函数尝试推断定界符(它假定定界符将始终出现在CSV的第一行中,紧随Panel/Node/Case之后)。
  • 它还尝试将后两列的值从文本转换为数字(通过将,替换为.)。如果您不希望这种行为,可以将其从代码中删除。另外,此转换仅适用于使用.作为十进制分隔符的语言环境。 (如果需要支持其他文化/地区,尝试推断文化/地区并将其作为第二个参数传递给Number.FromText可能更有意义。)

let
    data1 = Text.ToBinary(
    "Panel/Node/Case,MXX (kNm/m),MYY (kNm/m)
    1/ 1/ 1,145.46,145.46  
    1/ 1/ 2,98.83,98.83   
    1/ 1/ 3 (C),244.30,244.30  
    1/ 2/ 1,19.80,19.80   
    1/ 2/ 2,13.46,13.46   
    1/ 2/ 3 (C),33.26,33.26   
    1/ 3/ 1,19.80   
    1/ 3/ 2,13.46   
    1/ 3/ 3 (C),33.26   
    1/ 4/ 1,145.46  
    1/ 4/ 2,98.83   
    1/ 4/ 3 (C),244.30",TextEncoding.Utf8),data2 = Text.ToBinary(
    "Panel/Node/Case;    MXX (kNm/m);    MYY (kNm/m)
    1/ 1/ 1;            145,46;         145,46
    1/ 1/ 2;            98,83;          98,83
    1/ 1/ 3 (C);        244,30;         244,30
    1/ 2/ 1;            19,80;          19,80
    1/ 2/ 2;            13,46;          13,46
    1/ 2/ 3 (C);        33,26;          33,26
    1/ 3/ 1;            19,80
    1/ 3/ 2;            13,46
    1/ 3/ 3 (C);        33,26
    1/ 4/ 1;            145,46
    1/ 4/ 2;            98,83
    1/ 4/ 3 (C);        244,30",parseCsv = (someFile as binary) =>
        let
            lines = Lines.FromBinary(someFile,QuoteStyle.Csv,false,firstLine = List.First(lines),expectedDelimiterPosition = Text.Length("Panel/Node/Case"),delimiterInferred = Text.At(firstLine,expectedDelimiterPosition),csv = Csv.Document(someFile,[Delimiter = delimiterInferred,Encoding = TextEncoding.Utf8,QuoteStyle = QuoteStyle.Csv]),promoted = Table.PromoteHeaders(csv,[PromoteAllScalars=true]),lastTwoColumnsAsNumbers = 
                let
                    lastTwoHeaders = List.LastN(Table.ColumnNames(promoted),2),replaceAndConvertToNumber = (someText as text) as number => Number.From(Text.Replace(someText,",".")),transformers = List.Transform(lastTwoHeaders,each {_,replaceAndConvertToNumber,type number}),transformed = Table.TransformColumns(promoted,transformers)
                in transformed
        in lastTwoColumnsAsNumbers,parsed1 = parseCsv(data1),parsed2 = parseCsv(data2),parsed3 = parseCsv(File.Contents("C:\Users\MRCH\Desktop\Data1.csv"))
in
    parsed3

  • 要实现此目的,您可以复制上面的代码,创建一个空白查询(在我的Excel版本中,我通过以下方式执行此操作:数据>获取数据>从其他来源>从空白查询),单击高级编辑器(在左上角),删除任何现有代码,粘贴您复制的内容,然后单击“完成”。
  • 要使parseCsv函数与文件路径一起使用,您可以例如将parsed1 = parseCsv(data1)更改为parsed1 = parseCsv(File.Contents("SOME_FILE_PATH")),其中SOME_FILE_PATHData1.csv的文件路径在您的计算机上(保留双引号)。
  • 在查询编辑器中,您可以单击并查看表达式/步骤parsed1parsed2(基本上是parseCsv函数为Data1.csv和{{ 1}})。 Data2.csvdata1仅用于演示目的,您可以将它们替换为CSV的实际二进制内容。

如果这没有帮助,请告诉我可以改善的地方。

本文链接:https://www.f2er.com/2933415.html

大家都在问