我正在尝试清理在 csv 行中嵌入 \r\n 或 \n 的原始数据。行终止符是 \r\n。
- 尝试将 utf-8 标点符号转换为普通 ascii 标点符号。
- 清理 ascii 范围 00-7f 之外的任何多余 utf-8。
除了标点符号翻译逻辑之外,我能够编织下面的 Mule 4 dataweave 代码。使用了 reduce 但翻译不正确。
数据编织代码:
%dw 2.0
output application/csv header=true
var translateMap = {
"‘": "'", "’": "'", "‚": "'", "‛": "'",
"“": "\"", "”": "\"", "„": "\"",
"–": "-", "—": "--", "―": "--",
"…": "...", "•": "*",
"′": "'", "″": "\"",
"‹": "<", "›": ">", "«": "<<", "»": ">>",
" ": " ",
"‐": "-", "‑": "-", "‒": "-", "−": "-",
"©": "(c)", "®": "(R)", "™": "(TM)"
}
fun cleanField(value: String) = (
translateMap reduce ((acc, pair) -> acc replace pair.key with pair.value)
replace /(\r\n|\n)/ with " "
replace /[^\x00-\x7F]/ with ""
)
---
payload map (row) ->
row mapObject (key, value) -> {
(value) : cleanField(key)
}
示例数据:
Header1|Header2|Header3|Header4|Header5|Header6\r\n
Value1A|Value1B|Value1C|Value1D|Value1E|Value1F\r\n
Value2A|Value2B|Value2C—with—emdash|Value2D|Value2E|Value2F\r\n
Value3A|Value3B|Value3C|Value3D ␍\f mid-line |Value3E|Value3F\r\n
Value4A|‘Single’Quote|“Double”Quote|Value4D|Value4E|Value4F\r\n
Value5A|Value5B|Value5C|Value5D|Value5E|Value5F‐hyphen\r\n
样本数据说明:
行终止符:每行按要求以 \r\n 结尾。管道分隔:每条记录内的字段以管道符号 | 分隔。
页眉:第一行包含标题行:
页眉1|页眉2|页眉3|页眉4|页眉5|页眉6。五条记录:标题后面有五行数据。
六列:每条记录有六个值,用管道分隔。
UTF-8 标点符号:第 4 行包含左单引号 ' 和右双引号 “。
\r\n 位于行中:第 3 行包含 \r\n 行中。\r(回车符)和 \n(换页符)字符嵌入在“Value3D”字段中。
破折号:第 2 行在“Value2C”字段中包含一个破折号 —。
UTF-8 连字符:第 5 行在“Value5F”字段末尾包含非标准连字符 (U+2010,连字符)。
预期输出:
将 UTF-8 标点符号转换为 ASCII 标点符号
删除嵌入的换行符 \r\n。保留行终止符 \r\n
删除超出 ASCII 范围的任何其他 UTF-8
电流输出:
ASCII 被正确清理并嵌入行。标点符号的翻译不起作用。
新输出:
是的。我无法附加屏幕截图。
1. Header1|Header2|Header3|Header4|Header5|Header6
2. Value1A|Value1B|Value1C\r\n
|Value1D|Value1E|Value1F\r\n
3. Value2A|Value2B|Value2C--with--emdash|Value2D|Value2E|Value2F
4. Value3A|Value3B|Value3C|Value3D mid-line |Value3E|Value3F
5. Value4A|'Single'Quote|\"Double\"Quote|Value4D|Value4E|Value4F
6. Value5A|Value5B|Value5C|Value5D|Value5E|Value5F-hyphen
清理嵌入的 \r\n 非常棘手,需要保留真正的终止符。下面的替换对行没有任何影响。
replace /(\r\n|\n)/ with " "
如果没有看到预期的输出,很难说,但问题似乎是:
我修复了以下问题。我还使用了replaceAll()而不是 replace 来处理翻译映射。
输出: