【发布时间】:2018-04-04 08:24:42
【问题描述】:
我有一个 USQL 脚本和 CSV 提取器来加载我的文件。但是有些月份文件可能包含 4 列,有些月份可能包含 5 列。
如果我使用 4 或 5 个字段的列列表设置我的提取器,我会收到有关文件预期宽度的错误。去检查分隔符等。不足为奇。
鉴于 USQL 仍处于新手阶段并且缺少一些基本的错误处理,请解决此问题的方法是什么?
我尝试在提取器中使用 silent 子句来忽略更宽的列,这对于 4 列很方便。然后使用 IF 条件获取行集的行数,然后具有 5 列的提取器。然而,这会导致行集变量在 IF 表达式中不被用作标量变量。
我还尝试了 C# 样式计数和 sizeof(@AttemptExtractWith4Cols)。都不行。
代码 sn-p 让您了解我正在采用的方法:
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 块这样的东西,这会容易得多。
这是一个合理的方法吗?
任何意见将不胜感激。
感谢您的宝贵时间。
【问题讨论】: