LINUX.ORG.RU
ФорумJob

Добавление столбца в csv файл через командную строку

 , ,


0

1

Добрый день! Имеется два csv набора по португальским винам, ссылки прикрепил в самом низу. Необходимо через командную строку linux объединить 2 csv файла в один, при этом добавив столбец type, в котором будет указан вид вина - red/white. Далее нужно отфильтровать данные полученного файла, оставив в нем только вина с качеством больше 6 и содержанием спирта выше среднего.

Файлы скачал с помощью команды wget, так как заголовки столбцов совпадают, то объединяю командой cat, но не понимаю как можно добавить столбец type.

https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv

https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv



Последнее исправление: karbonary (всего исправлений: 1)

Ответ на: комментарий от xaizek

или sqlite, а точнее наскриптованные поверх него querycsv (https://pythonhosted.org/querycsv/)

где-то ещё попадались тулзы для запросов CSV файлов как SQL-таблиц. Но что-то с лёту не нашлось

MKuznetsov ★★★★★
()

либо 40 строк кода на питоне и час времени в режиме чтения гугла,

либо закат солнца вручную на bash и утилитах.

vyv ★★★
()

man awk, читать до просветления

erfea ★★★★★
()

awk или python с pandas-ом/csv в зависимости от того что удобнее и насколько сложные манипуляции хочется делать

peregrine ★★★★★
()
#!/usr/bin/perl

use strict;

###
my $file_red   = './winequality-red.csv';
my $file_white = './winequality-white.csv';
my $file_out   = './result.csv';
###

my $first = 1;

open( my $fout, ">", $file_out ) or die $!;
add_file( $file_red,   'red' );
add_file( $file_white, 'white' );
close $fout;

sub add_file {
    my $namefile = shift;
    my $type     = shift;

    open( my $fh, "<", $namefile ) or die $!;

    if ( $first ) {
        print $fout '"type";' . <$fh>;
        $first = 0;
    }

    while ( my $line = <$fh> ) {
        my @ar_line = split( ';', $line );
        my $alcohol = $ar_line[10];
        my $quality = $ar_line[11];

        if ( $alcohol > 10 && $quality > 6 ) {
            print $fout "$type;$line";
        }
    }

    close $fh;
    return;
}

1;
WinLin2 ★★
()
Последнее исправление: WinLin2 (всего исправлений: 2)
Ответ на: комментарий от WinLin2

Всё тело цикла в 2 строки укладывается, ретурн не нужен, а варнинги нужны. Числовые литералы в коде. Сискол не проверяется на возврат. Лишние параметры в функции.

Как минимум 10 лет в профессии и до сих пор не научились писать на перле, хотя указываете его в своем стеке.

level1 ★★
()
Последнее исправление: level1 (всего исправлений: 1)
Ответ на: комментарий от level1

Можно и короче написать, сделал понятнее для «пользователя». Спасибо все равно не дождался :)

WinLin2 ★★
()
Последнее исправление: WinLin2 (всего исправлений: 1)
#!/bin/bash

WW="winequality-white.csv"
WR="winequality-red.csv"
WINE="winequality-final.csv"

[[ -n $WW && -n $WR ]] || { echo "no such file"; exit; }

for VWR in $WW $WR; do
    {
    read a
    if [[ $VWR == $WW ]]; then
        echo "$a;\"type\"" > $WINE
	CLV="white"
    else
	CLV="red"
    fi
    while read b; do
	echo $b | {
	    IFS=";" read -a d
	    if (( $(echo "${d[11]} > 6"  | bc -l) &&
		  $(echo "${d[10]} > 10" | bc -l) )); then
		      echo "$b;$CLV" >> $WINE
	    fi
	}
    done
    } < $VWR
done
ashot ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.