如何从字符串数据获取RECORD定义?利用逻辑文件ECL属性解析布局
解决方案
完全可以直接解析该ECL属性的输出结果生成RECORD定义,不用重复手动编写布局,具体操作如下:
第一步:获取完整的RECORD定义
执行你提到的代码OUTPUT(STD.File.GetLogicalFileAttribute(file,'ECL'),NAMED('ECL'));,输出结果就是该逻辑CSV文件对应的完整RECORD结构代码,比如会得到类似这样的内容:RECORD STRING(50) UserName; INTEGER Age; DATE RegisterDate; END;第二步:直接复用该定义
把输出的这段RECORD代码直接复制到你的ECL脚本中,作为自定义的RECORD类型使用,比如:TargetRecord := RECORD STRING(50) UserName; INTEGER Age; DATE RegisterDate; END;第三步:转换为平面文件
用这个复用的RECORD类型读取逻辑CSV文件,再输出为平面文件即可,示例代码:// 指定逻辑CSV文件路径 logicalCsvFile := 'path/to/your/logical.csv'; // 复用获取到的RECORD定义 TargetRecord := RECORD STRING(50) UserName; INTEGER Age; DATE RegisterDate; END; // 读取逻辑文件 dataDs := DATASET(logicalCsvFile, TargetRecord, CSV(HEADING(1))); // 输出为平面文件 OUTPUT(dataDs,,'path/to/output/flat.file',FLAT());
如果不想手动复制,也可以利用ECL的动态代码加载特性(比如通过INCLUDE引用临时生成的定义文件),但日常场景下直接复制输出的RECORD代码是最直接高效的方式,完全避免了重复创建相同布局的麻烦。
内容的提问来源于stack exchange,提问作者Zelazny7
相关产品推荐
相关产品推荐

