Чи є утиліта командного рядка для переміщення CSV-файлу?


16

Дано такий файл

First,Last,Age
Cory,Klein,27
John Jacob,Smith,30

Чи є утиліта командного рядка для переміщення вмісту, щоб результат виглядав так

First,Cory,John Jacob
Last,Klein,Smith
Age,27,30

Відповіді:


6
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv

Чи не З огляду на вік цього питання я виправдає мої зміни до цього як прийнято: а) Відповідь на це питання набагато більш ємним , ніж Жиль python, б) rubyє не менш компактний , ніж pythonта в) це також показує , як передати вхід / вихід файли. Браво @luikore, і ласкаво просимо до Unix & Linux. Будь ласка, тримайтеся навколо.
— Cory Klein

один застереження, в csv, поля повинні бути цитовані
— yosefrow

@yosefrow Не потрібно цитувати. Я перевірив команду ще до того, як опублікував цю відповідь.
— luikore

гаразд, тоді слід було сказати "може". Це не працювало для мене, поки я не процитував усі поля. Можливо, це стосується мого вмісту даних
— yosefrow

16

Аналіз CSV не легко виконати лише за допомогою інструментів POSIX, якщо тільки ви не використовуєте спрощений варіант CSV без котирування (щоб коми не з’являлися в полі). Навіть тоді це завдання здається непростим у виконанні програми awk або іншої обробки тексту інструментом. Ви можете використовувати Perl з Text::CSV, Python з csv, R з read.csv, Ruby з CSV ,… (усе це є частиною стандартної бібліотеки відповідної мови, за винятком Perl.)

Наприклад, у Python:

import csv, sys
rows = list(csv.reader(sys.stdin))
writer = csv.writer(sys.stdout)
for col in xrange(0, len(rows[0])):
    writer.writerow([row[col] for row in rows])

11

З /programming//a/2776078 :

$ apt-get install csvtool

А потім конвертувати

$ csvtool transpose input.csv > ouput.csv

Або в трубопроводі

$ ... | csvtool transpose - | ...

1
гарний. Тільки ... | csvtranspose | ...би перемогти це, синтаксис.
— masterxilo

3

Швидке та брудне рішення:

c=1
file=file.txt
num_lines=$(wc -l < "$file")

for ((i=0; i<num_lines; i++)) {
    cut -d, -f$c "$file" | paste -sd ','
    ((c++))
}

що являє собою / tmp / l? Крім того, чи не буде простішим for ((i=1; i<=$num_cols; ++i)); do paste -s -d, <(cut -f$i -d, file.txt); done
— прокручувати

Зауважте, що це працює для введення ОП, але лише тому, що їхні дані мають однакову кількість рядків і стовпців, що зазвичай не так.
— tokland

У csv є специфікація щодо котируючих даних, тобто this "is" exampleклітинка закодована. "this ""is"" example"Я не переконаний, чи це рішення належним чином обробляє такі випадки
— Grzegorz Wierzowiecki

0

Враховуючи запропоновані обмеження (без цитування, без вбудованих коми), це просто в awk (як це було б в perl, не враховуючи більше тисячі рядків у CSV.pm, 2300 рядків у csv.rb- python має всього 450 рядків csv.py).

Ось приклад для awk:

#!/usr/bin/awk -f
BEGIN { width=0; }
{
    max = split($0, list, ",");
    # printf "%d:%s\n", NR, $0;
    if (width < max)
        width = max;
    for (n = 1; n <= max; ++n) {
        sub("^[     ]*","",list[n]);
        sub("[  ]*$","",list[n]);
        # printf "\t%d:%s\n", n, list[n];
        if ( columns[n] != "" ) {
            columns[n] = columns[n] ", ";
        }
        columns[n] = columns[n] list[n];
    }
}
END {
    # printf "%d columns\n", width;
    for (n = 1; n <= width; ++n) {
        printf "%s\n", columns[n];
    }
}

До речі: даний приклад мав додатковий простір, який припускав, що ОП буде видалено; інші приклади не стосувалися цієї деталі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.