4

ファイルをロードするための USQL スクリプトと CSV エクストラクタがあります。ただし、ファイルに 4 列が含まれる月もあれば、5 列が含まれる月もあります。

4 つまたは 5 つのフィールドの列リストを使用してエクストラクターをセットアップすると、ファイルの予想される幅に関するエラーが発生します。区切り文字などをチェックしてください。当然のことです。

USQL がまだ初心者であり、いくつかの基本的なエラー処理が欠けていることを考えると、この問題の回避策は何ですか?

エクストラクタでサイレント句を使用して、4 列に便利な幅の広い列を無視しようとしました。次に、IF 条件を使用して行セットの行数を取得し、5 列のエクストラクターを使用します。ただし、これは、IF 式でスカラー変数として使用されない行セット変数の世界につながります。

また、C# スタイルの count と sizeof(@AttemptExtractWith4Cols) も試しました。どちらも機能しません。

私が取っているアプローチの感触をつかむためのコードスニペット:

DECLARE @SomeFilePath string = @"/MonthlyFile.csv";

@AttemptExtractWith4Cols =
    EXTRACT Col1 string,
            Col2 string,
            Col3 string,
            Col4 string
    FROM @SomeFilePath
    USING Extractors.Csv(silent : true); //can't be good.

//can't assign rowset to scalar variable!
DECLARE @RowSetCount int = (SELECT COUNT(*) FROM @AttemptExtractWith4Cols);

//tells me @AttemptExtractWith4Cols doesn't exist in the current context!
DECLARE @RowSetCount int = @AttemptExtractWith4Cols.Count();

IF (@RowSetCount == 0) THEN
    @AttemptExtractWith5Cols =
        EXTRACT Col1 string,
                Col2 string,
                Col3 string,
                Col4 string,
                Col5 string
        FROM @SomeFilePath
        USING Extractors.Csv(); //not silent
END;


//etc

もちろん、USQL にTRY CATCHブロックのようなものがあれば、これはずっと簡単になります。

これは取るべき合理的なアプローチでさえありますか?

任意の入力をいただければ幸いです。

お時間をいただきありがとうございます。

4

3 に答える 3

3

The OUTER UNION is a great solution. Alternatively, you can also write your own generic extractor if you expect your rows in a file to be different. See this blog post for an example.

于 2016-11-10T01:59:53.383 に答える