remove padrão duplicado / entradas dentro de cada campo no arquivo CSV

1

Como faço para remover entradas duplicadas dentro de cada campo separado com a amostra abaixo como dados.

0x,9.4,,,#0,#UNIX#unix,#cli#L#فا#0#فا#0#L#SE#Cli#SE,#فارسی#فارسی#۱#1#١#1,bsh,#V & v

saída esperada (exclua todas as duplicadas, não diferencie maiúsculas de minúsculas, a diferença em Unicode "persa / árabe ", a ordem das entradas e qual entrada (caso ignorado) deve ser mantida não importa aqui):

0x,9.4,,,#0,#unix,#cli#L#فا#0#SE,#فارسی#١#۱#1,bsh,#V & v

O padrão está neste formato #x , x significa qualquer coisa em um ou mais caracteres.

Tabela Unicode para diferenças de alfabeto / números em idiomas persa / árabe

    
por αғsнιη 19.03.2018 / 19:32

3 respostas

1

Usando uma linha de comando em uma concha (apenas algumas linhas ) com um analisador adequado de :

perl -CS -Mopen=":std,IN,OUT,IO,:encoding(utf8)" -MText::CSV -lne '
    BEGIN{
        our $csv = Text::CSV->new({ sep_char => "," });
        sub uniq { my %seen;  grep !$seen{lc $_}++, @_; }
    };
    $csv->parse($_) or die "parse error";
    print join ",", map { join "#", uniq split /#/ } $csv->fields();
' file.csv

Saída:

0x,9.4,,,#0,#UNIX,#cli#L#فا#0#SE,#فارسی#۱#1#١,bsh,#V & v

Nota:

  • requer a instalação do módulo Text::CSV perl: sudo apt-get install libtext-csv-perl para debian e derivative
por 19.03.2018 / 20:03
1

Conclua a solução Python :

Script

uniq_arabic_csv.py :

#!/bin/python

import sys, re

csv_data = sys.stdin.read().strip()
result = []

for item in csv_data.split(','):
    matches = list(re.finditer(r'#[^#]+', item, re.U | re.I))
    if not matches or len(matches) == 1:
        result.append(item)
    else:
        s, res = set(), []
        for m in matches:
            m = m.group()
            if m.lower() not in s: res.append(m)
            s.add(m.lower())
        result.append(''.join(res))

result = ','.join(result)                    
print(result)

Uso:

s="0x,9.4,,,#0,#UNIX#unix,#cli#L#فا#0#فا#0#L#SE#Cli#SE,#فارسی#فارسی#۱#1#۱#1,bsh,#V & v"
python uniq_arabic_csv.py <<<"$s"

A saída:

0x,9.4,,,#0,#UNIX,#cli#L#فا#0#SE,#فارسی#۱#1,bsh,#V & v
    
por 19.03.2018 / 21:03
0

Codifico abaixo da solução awk simples:

awk -F, '{ i=0; comma=""; while (++i<=NF) {
    if ( split(tolower($i), arr, /#/)>1 ){ for(v in arr) !unq[arr[v]]++;printf comma;
        for (x in unq) {printf (x!="")?hash""x:""; hash="#"; delete unq[x]}}
    else {printf comma""$i; comma=","}}; print ""
}' infile.csv
    
por 19.03.2018 / 23:04