我有一个USQL脚本和CSV提取器来加载我的文件.但是有些月份文件可能包含4列,有些月份可能包含5列.如果我使用4或5个字段的列列表设置我的提取器,我会收到有关文件预期宽度的错误.去检查分隔符等等.毫不奇怪.这个问题...
我有一个USQL脚本和CSV提取器来加载我的文件.但是有些月份文件可能包含4列,有些月份可能包含5列.
如果我使用4或5个字段的列列表设置我的提取器,我会收到有关文件预期宽度的错误.去检查分隔符等等.毫不奇怪.
这个问题的解决方法是什么,因为USQL仍然是一个新手并且缺少一些基本的错误处理?
我已经尝试在提取器中使用silent子句忽略更宽的列,这对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块这样的事情,那将会容易得多.
这甚至是一种合理的方法吗?
任何投入将不胜感激.
感谢您的时间.
解决方法:
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列.该脚本在任一方案中都成功运行.
我的结果:
希望有道理.
本文标题为:c# – 在USQL中处理具有不同列的文件
- C# 时间与时间戳互转的方法(13位) 2023-01-06
- C# 8.0新特性介绍 2022-11-19
- C# WPF 通过委托实现多窗口间的传值的方法 2022-12-31
- C# datagrid非常规方法实现添加合并列 2023-01-06
- C#调用JS的几种方法 2023-03-28
- 分析C# Dictionary的实现原理 2023-04-22
- c# – 使用MvvmCross添加Windows 8.1存储基本页面(不再继承自不存在的LayoutAware但基本页面类) 2023-09-18
- C#使用远程服务调用框架Apache Thrift 2023-06-21
- 基于C# 写一个 Redis 数据同步小工具 2023-02-08
- DataGridView自定义单元格表示值、Error图标显示的方法介绍 2023-05-23