2016-11-09 14 views
2

ファイルをロードするためのUSQLスクリプトとCSV抽出プログラムがあります。ただし、ファイルの数ヶ月は4列、いくつかの月は5列を含むことがあります。USQLで異なる列のファイルを処理する

フィールドを4つまたは5つ選択してエクストラクタを設定すると、予想されるファイルの幅に関するエラーが発生します。チェックデリミタなどを実行します。驚きはありません。

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

エクステンダのサイレント句を使用して、4列分の幅の広い列を無視しようとしました。次に、IF条件付きの行セットの行数を取得します。これには5列の抽出が含まれています。ただし、IF式ではスカラー変数として使用されない行セット変数の世界が発生します。

また、C#スタイルのカウントとsizeof(@ AttemptExtractWith4Cols)を試しました。どちらもうまくいきません。多くが容易になるだろうUSQLこの中TRY CATCHブロックのようなものがあった場合はもちろん、

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 

コードスニペットはあなたに私が取っているアプローチの感触を得ました。

これは合理的なアプローチですか?

すべての入力をいただければ幸いです。

ありがとうございます。

答えて

2

U-SQLは今OUTER UNIONをサポートしていますので、あなたはこのようにそれを扱うことができます。私の例では

// Scenario 1; file has 4 columns 
DECLARE @file1 string = @"/input/file1.csv"; 

// Scenario 2; file has 5 columns 
//DECLARE @file1 string = @"/input/file2.csv"; 


@file = 
    EXTRACT col1 string, 
      col2 string, 
      col3 string, 
      col4 string 
    FROM @file1 
    USING Extractors.Csv(silent : true) 

    OUTER UNION ALL BY NAME ON (col1, col2, col3, col4) 

    EXTRACT col1 string, 
      col2 string, 
      col3 string, 
      col4 string, 
      col5 string 
    FROM @file1 
    USING Extractors.Csv(silent : true); 


@output = 
    SELECT * 
    FROM @file; 


OUTPUT @output 
    TO "/output/output.csv" 
USING Outputters.Csv(); 

、FILE1は4列を持つとfile2は、5つの列があります。どちらのシナリオでもスクリプトは正常に実行されます。

マイ結果:理にかなっている

U-SQL results

希望。

2

OUTER UNIONは最適なソリューションです。また、ファイル内の行が異なっていると思われる場合は、独自の汎用エクストラクタを記述することもできます。例については、this blog postを参照してください。

+0

ありがとうマイク、私は見てみましょう。 –

関連する問題