Какой самый простой способ реструктурировать этот CSV? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть CSV-файл, содержащий данные о клиентах в отдельных строках, которые я хочу преобразовать.

Текущий макет:

Client_Name,Client_ID,Client_Group,Attribute_Name,Date,Attribute_Value

Каждая строка содержит информацию о клиенте, например::

Acme,0001,Marketing,Sales_Amt,2010-10-01,100
Acme,0001,Marketing,Queries,2010-10-01,3
Smiths,0002,Retail,Sales_Amt,2010-10-01,1200
Smiths,0002,Retail,Queries,2010-10-01,11

Я хочу преобразовать его в следующий формат временных рядов:

Date,Client_Name,Sales_Amt,Queries

, чтобы каждая строка читала:

2010-10-01,Acme,100,3
2010-10-01,Smiths,1200,11

ТакЯ могу видеть в день, по атрибутам клиента. Это работа для ETL или я могу сделать это легко с помощью таких инструментов манипулирования файлами, как sed & awk?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019
$ cat tst.awk
BEGIN { FS=OFS="," }
{
    sub(/\r$/,"")
    curr = $5 OFS $1
}
curr != prev {
    if ( NR > 1 ) {
        print prev, vals[1], vals[2]
    }
    prev = curr
    cnt = 0
}
{ vals[++cnt] = $NF }
END {
    print prev, vals[1], vals[2]
}

$ awk -f tst.awk file
2010-10-01,Acme,100,3
2010-10-01,Smiths,1200,11

См. Какой самый надежный способ эффективного анализа CSV с помощью awk? для получения дополнительной информации о синтаксическом анализе CSV с помощью awk.

0 голосов
/ 06 ноября 2019

Perl и его Text :: CSV_XS на помощь!

perl -MText::CSV_XS=csv -we '
    csv(in    => shift,
        on_in => sub { $h{ $_[1][4] }{ $_[1][0] }[ $_[1][3] eq "Queries" ] = $_[1][5] },
        out   => \"skip");
    csv(in => [ map { $x = $_;
                      map [$x, $_, @{ $h{$x}{$_} } ],
                      sort keys %{ $h{$_} }
                } sort keys %h ]);
' -- file.csv

Сначала он заполняет хеш %h данными, которые вы хотите сохранить, а затем выводит их какновый csv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...