Estou tentando limpar dados brutos que possuem \r\n ou \n incorporados em linhas csv. O terminador de linha é \r\n.
- tentando traduzir sinais de pontuação utf-8 para sinais de pontuação ascii normais.
- limpando qualquer utf-8 extra do intervalo ascii 00-7f.
Sou capaz de tecer abaixo do código dataweave do Mule 4, exceto a lógica de tradução de pontuação. Usei reduce, mas não está traduzindo corretamente.
código dataweave:
%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)
}
Dados de amostra:
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
Explicação dos dados da amostra:
Terminador de Linha: Cada linha termina com \r\n, conforme solicitado. Separados por Barras Diretas: Os campos dentro de cada registro são separados pelo símbolo de barra vertical|.
Cabeçalho: A primeira linha contém a linha de cabeçalho:
Cabeçalho1|Cabeçalho2|Cabeçalho3|Cabeçalho4|Cabeçalho5|Cabeçalho6.Cinco registros: há cinco linhas de dados seguindo o cabeçalho.
Seis colunas: cada registro tem seis valores separados por barras verticais.
Sinais de pontuação UTF-8: A linha 4 contém uma aspa simples à esquerda ' e uma aspa dupla à direita “.
\r\n no meio da linha: A linha 3 contém \r\n no meio da linha. Os caracteres \r (retorno de carro) e \n (avanço de página) estão incorporados no campo "Value3D".
Emdash: A linha 2 contém um travessão — dentro do campo "Value2C".
Hífen UTF-8: A linha 5 contém um hífen não padrão (U+2010, Hífen) no final do campo "Value5F".
Saída esperada:
traduzir sinais de pontuação UTF-8 com ASCII
remover quebras de linha incorporadas \r\n. preservar o terminador de linha \r\n
remova qualquer outro UTF-8 que esteja fora do intervalo ASCII
saída de corrente:
O ASCII está sendo limpo corretamente e as linhas incorporadas. A tradução da pontuação não está funcionando.
nova saída:
Sim. Não consegui anexar a captura de tela.
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
Limpar o \r\n incorporado é complicado, preservando o terminador real. As substituições abaixo não têm nenhum efeito on-line.
replace /(\r\n|\n)/ with " "