Как «Частично транспонировать и дублировать» строки в CSV с помощью инструмента командной строки CSV

#csv #command-line-interface

#csv #интерфейс командной строки

Вопрос:

У меня снова и снова такие CSV-файлы (отформатированные в виде таблицы):

 | PRODUCT | REGION   | COMMENT  | SALES1   | SALES2  | SALES3 |
| ------- | -------- | -------- | -------- | ------- | ------ |
| Orange  | Valencia | good     | Peter    |         |        |
| Apple   | Bavaria  | mediocre | Maria    | Walter  |        |
| Dates   | Dubai    | good     | Angelica | William | Jessie |
  

В этом CSV я хочу перенести последние три столбца в один столбец, дублируя информацию из других столбцов, чтобы результат выглядел следующим образом:

 | PRODUCT | REGION   | COMMENT  | SALES    |
| ------- | -------- | -------- | -------- |
| Orange  | Valencia | good     | Peter    |
| Apple   | Bavaria  | mediocre | Maria    |
| Apple   | Bavaria  | mediocre | Walter   |
| Dates   | Dubai    | good     | Angelica |
| Dates   | Dubai    | good     | William  |
| Dates   | Dubai    | good     | Jessie   |
  

Конечно, я могу написать небольшой (Python) скрипт для этого, но мой вопрос:

Является ли это несколько стандартной операцией для таблиц / CSV / matrices и может ли какой-либо из существующих инструментов командной строки CSV (например csvkit , miller , csvtool , и т.д.) Сделать это, возможно, из коробки?

Комментарии:

1. Ваш входной файл представляет собой CSV или markdown?

2. Входные данные — это CSV, но если вам это нужно как таблица уценки, как я ее отформатировал, вы можете, например, использовать csvlook из проекта csvkit .

Ответ №1:

В Miller (https://github.com/johnkerl/miller ) начиная с

 PRODUCT,REGION,COMMENT,SALES1,SALES2,SALES3
Orange,Valencia,good,Peter,,
Apple,Bavaria,mediocre,Maria,Walter,
Dates,Dubai,good,Angelica,William,Jessie
  

и запуск

 mlr --csv reshape -r "SALE" -o item,value then filter '$value=~". "' then cut -x -f item then rename value,SALES input.txt
  

у вас будет

  --------- ---------- ---------- ---------- 
| PRODUCT | REGION   | COMMENT  | SALES    |
 --------- ---------- ---------- ---------- 
| Orange  | Valencia | good     | Peter    |
| Apple   | Bavaria  | mediocre | Maria    |
| Apple   | Bavaria  | mediocre | Walter   |
| Dates   | Dubai    | good     | Angelica |
| Dates   | Dubai    | good     | William  |
| Dates   | Dubai    | good     | Jessie   |
 --------- ---------- ---------- ---------- 
  

Комментарии:

1. Хорошо, если это сработает, пожалуйста, отметьте этот ответ как правильный 🙂

2. Пришлось установить Miller, но он работает потрясающе. Еще раз спасибо. Я, конечно, сделаю больше с Miller!