Существует ли утилита командной строки для перемещения файла CSV?

Я работаю sudo непосредственно из сценария:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
16
27.11.2018, 04:10
5 ответов
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv
10
27.01.2020, 19:48

Парсинг 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])
16
27.01.2020, 19:48

Быстрое и грязное решение :

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++))
}
3
27.01.2020, 19:48
  • 1
    , что представляет/tmp/l? Кроме того, был бы он не быть более простым циклично выполниться через столбцы, а не строки, что-то вроде for ((i=1; i<=$num_cols; ++i)); do paste -s -d, <(cut -f$i -d, file.txt); done –  iruvar 08.01.2013, 15:29
  • 2
    Обратите внимание, что это работает на вход OP, но только потому, что их данные имеют то же количество строк и столбцов, который обычно не имеет место. Проверка –  tokland 14.03.2016, 15:24
  • 3
    csv имеет спецификацию относительно кавычек dpuble, т.е. this "is" example ячейка кодируется "this ""is"" example" Я не убежден, обрабатывает ли это решение такие случаи правильно –  Grzegorz Wierzowiecki 05.10.2016, 15:44

Учитывая предлагаемое ограничение (без кавычек, без встроенных запятых), это просто в 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];
    }
}

Между прочим: в данном примере было лишнее пространство, которое OP предположил, что он будет удален; в других примерах эта деталь не рассматривалась.

0
27.01.2020, 19:48

Из https://stackoverflow.com/a/2776078 :

$ apt-get install csvtool

А затем преобразовать

$ csvtool transpose input.csv > ouput.csv

Или в конвейере

$ ... | csvtool transpose - | ...
11
27.01.2020, 19:48

Теги

Похожие вопросы