我有一个 USQL 脚本和 CSV 提取器来加载我的文件。但是有些月份文件可能包含 4 列,有些月份可能包含 5 列。
如果我使用 4 或 5 个字段的列列表设置我的提取器,我会收到有关文件预期宽度的错误。去检查定界符等。不足为奇。
鉴于 USQL 仍处于新手阶段并且缺少一些基本的错误处理,请解决此问题的方法是什么?
我尝试在提取器中使用静默子句来忽略更宽的列,这对于 4 列很方便。然后使用 IF 条件获取行集的行数,然后具有 5 列的提取器。然而,这会导致行集变量在 IF 表达式中不被用作标量变量。
我还尝试了 C# 样式计数和 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块这样的东西,这会容易得多。
这甚至是一个合理的方法吗?
任何投入将不胜感激。
感谢您的时间。