如何查询不同结构的文件?

how to query differently-structured files?

是否可以针对具有不同架构的文件执行查询?

我在同一目录中有 2 组文件。第二种类型有一个额外的字段。

类型 1

id, first, last
1, liza, smith

类型 2

id, first, last, state
4, alex, gordon, CT

想要的结果

1, liza
4, alex

我们如何查询具有不同模式的文件,但您想要相同的输出字段?

这是我拥有的:

SELECT id, first                
FROM "/one 1300/{files}.csv"
USING Extractors.Csv();

@interestingRows = SELECT id, first FROM  @interestingRows;

OUTPUT @interestingRows
TO @uriPrefix + "/one 1300/output/output.csv"
USING Outputters.Csv();

CSV 输出器无法解决您的问题。 您将需要一个自定义提取器来解决这个问题。 我推荐你使用 Flexible Extractor

检查这个:

https://github.com/Azure/usql/tree/master/Examples/FlexibleSchemaExtractor

https://blogs.msdn.microsoft.com/mrys/2016/08/15/how-to-deal-with-files-containing-rows-with-different-column-counts-in-u-sql-introducing-a-flexible-schema-extractor/

另一种解决方案是分别提取具有不同架构的数据

既然你说这两个类型实际上在同一个文件中,假设它们是这样的:

您只需将其与所有列一起提取并将引号设置为 false:

//Extract the data
@extractedData =
    EXTRACT id int,
            first string,
            last string,
            state string
    FROM "data.csv"
    USING Extractors.Csv(skipFirstNRows : 1, quoting: false);

那么你只需select你需要的字段并输出它们:

//Select the fields
@finalData = SELECT id, first FROM @extractedData;

//Output the data
OUTPUT @finalData 
    TO "/Desired Result.csv"
    USING Outputters.Csv(quoting: false);

想要的结果:

如何使用您知道数据中不存在的定界符将列作为一个列导入,然后使用字符串 class 的 Split 方法将其拆分?像这样:

@working =
    EXTRACT wholeRow  string
    FROM "/one 1300/{*}.csv"
    USING Extractors.Text(delimiter:'|');


@working =
    SELECT 
        wholeRow.Split(',')[0] AS id,
        wholeRow.Split(',')[1] AS first,
        wholeRow.Split(',')[2] AS last
    FROM @working;


OUTPUT @working
TO "/output/output.csv"
USING Outputters.Csv(quoting:false);