удалить дублированный шаблон / записи в каждом поле в файле CSV


1

Как удалить повторяющиеся записи в каждом отдельном поле с данными ниже в качестве данных.

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

ожидаемый результат (либо удалите все дублированные, без учета регистра, разницу в Unicode "персидский / арабский ", порядок записей и то, какую запись (игнорировать регистр) следует сохранить, здесь не имеет значения):

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

Узор в этом формате #x, xзначит , что - нибудь в одном или более длиной символов.

Таблица Unicode для различий алфавита / цифр персидского / арабского языков

Ответы:


1

Использование командной строки в оболочке (всего несколько строк) с правильным парсером :

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

Выход :

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

Примечание :

  • Требуется установить Text::CSVмодуль Perl: sudo apt-get install libtext-csv-perlдля Debian и производного

1

Комплексное Pythonрешение:

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)

Использование:

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"

Выход:

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

0

Я кодирую ниже простое awkрешение, а также:

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.