如何在QlikSense脚本中批量移除所有列的乱码字符并转换数据?
QlikSense脚本批量移除乱码字符的解决方案
针对所有列存在类似��345的乱码场景,可通过批量遍历字段+字符串过滤函数实现一次性处理,以下是几种实用方案:
方案1:使用KeepChar保留指定有效字符
适合明确需要保留的字符类型(如数字、字母)的场景,直接移除所有不在指定集合内的字符:
// 1. 加载原始数据(替换为你的数据源) RawData: LOAD * FROM [your_source.qvd] (qvd); // 2. 遍历所有字段批量清洗 FOR each vField in FieldList('RawData') // 生成清洗后的临时表 RawData_Clean: NOCONCATENATE LOAD *, // 保留数字和大小写字母,可根据需求扩展字符集(如添加中文、符号) KeepChar($(vField), '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') as [$(vField)_Clean] RESIDENT RawData; // 删除原始表,重命名字段并保留清洗后的数据 DROP TABLE RawData; RENAME TABLE RawData_Clean TO RawData; RENAME FIELD [$(vField)_Clean] TO $(vField); NEXT vField
方案2:使用正则表达式精准过滤(RegExpReplace)
适合需要更复杂规则的场景(如移除所有非打印字符、特定乱码符号):
// 1. 加载原始数据 RawData: LOAD * FROM [your_source.csv] (txt, utf8, embedded labels); // 2. 批量正则清洗 FOR each vField in FieldList('RawData') RawData_Clean: NOCONCATENATE LOAD *, // 移除所有非数字、非字母的字符,可修改正则表达式适配你的需求 RegExpReplace($(vField), '[^0-9A-Za-z]', '') as [$(vField)_Clean] RESIDENT RawData; DROP TABLE RawData; RENAME TABLE RawData_Clean TO RawData; RENAME FIELD [$(vField)_Clean] TO $(vField); NEXT vField
方案3:加载源数据时直接处理(性能更优)
如果数据量较大,建议在首次加载时就完成清洗,避免二次RESIDENT加载的性能损耗:
// 1. 先获取源数据的所有字段名 TempFieldList: LOAD Distinct FieldName() as FieldName FROM [your_source.csv] (txt, utf8, embedded labels); // 2. 动态构建清洗后的LOAD字段语句 Let vLoadStatement = ''; FOR each vField in FieldList('TempFieldList') // 拼接每个字段的清洗逻辑 Let vLoadStatement = vLoadStatement & ', KeepChar(' & vField & ', ''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'') as ' & vField & Chr(10); NEXT vField // 3. 加载清洗后的最终数据 CleanData: LOAD // 去掉语句开头多余的逗号 Mid('$(vLoadStatement)', 2) FROM [your_source.csv] (txt, utf8, embedded labels); // 清理临时表 DROP TABLE TempFieldList;
关键注意事项
- 字符集调整:根据实际业务需求修改
KeepChar的保留字符集或正则表达式,例如需要保留中文可添加'\u4e00-\u9fa5'到正则规则中。 - 乱码定位:若乱码是特定的不可见控制字符,可先用
Asc()函数获取字符的ASCII码,再用PurgeChar或Replace精准移除。 - 表名与字段名:确保
FieldList()中指定的表名与你的原始表一致,避免字段遍历错误。
内容的提问来源于stack exchange,提问作者Seemakurthi Jaswanth
相关产品推荐
相关产品推荐

