LINUX.ORG.RU

Красивое рисование таблиц из командной строки

 ,


0

2

Приветствую!

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

Исходные данные имеют вид:

A : B = C
A : B = C
...

где A и B - строки из двух конечных множеств, а C - числовое значение (дробное). Хочу из этого получить таблицу

    A1  A2  A3 ...
B1  C11 C12 C13 ...
B2  C21 ... ... ...
B3  ... ... ... ...
... ... ... ... ...

при этом строки могут быть относительно длинные (но сравнимой друг с другом длины), хочется, чтобы метки по горизонтали рисовались наклонно, не сильно увеличивая ширину столбцов. Попутно хочется округлить все C значения до какой-то позиции после запятой. И, возможно, автоматически раскрасить метки в разные цвета для улучшения восприятия.

Все это хочется сделать из командной строки, без иксов, отрисовать в векторную или растровую картинку. И чем-то, что присутствует в RHEL 6 либо быстро ставится.


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

Ну я предпочел бы готовое решение. Графики, вот, можно по-всякому рисовать - таблички тоже весьма типовой случай.

moroz ()
Ответ на: комментарий от Ygor

Latex недалеко ушел от питона. Да и выглядит несколько overkill для рисования нескольких табличек.

moroz ()
Ответ на: комментарий от anonymous

Ничего глупее предложений, начинающихся с «ничего» и заканчивающихся «нет» да.

anonymous ()
Ответ на: комментарий от hibou

в каждой рекурсии есть доля рекурсии

anonymous ()

Надо ещё? Картинка. Это на питоне3+каиро, если надо, то вышлю скрипт. Каиро кроме .png может сохранять в .svg и .pdf.

anonymous ()
Ответ на: комментарий от Ygor

После пары часов вспоминания перла и гугленья примеров по troff+tbl я получил такое убожество: http://imgur.com/072GKrS (-Thtml) или такое: http://imgur.com/1dm5MLk (-Tps)

Как-то это сильно далеко от желаемого результата и неудовлетворительно по отношению к приложенным усилиям.

moroz ()
Ответ на: комментарий от anonymous

Вот. Это самое близкое к желаемому результату пока. Что-то как-то уныла необходимость ради такой простой операции писать полноценные программы.

От 3-го питона на RHEL 6 мало толку, т.к. надо как-то извращаться ставить, что особенно забавно без рутовых прав, но все равно спасибо.

moroz ()
Ответ на: комментарий от moroz

С помощью CSS в HTML можно сделать даже лучше и, что важно, гораздо проще. В CSS3, например, есть transform:rotate(), а с помощью хитрых селекторов ты можешь выбрать, например, каждую вторую строку или каждый второй столбец и присвоить им свой стиль.

http://www.w3schools.com/html/html_tables.asp

Скрипт на втором питоне тоже сработал ). Но там кроме питона ещё cairo и питоновские биндинги к нему надо. В теории, если питон2 и cairo установлены, то биндинги можно закинуть прям рядом со скриптом. Можешь скачать собранные с репов и скопировать папку cairo к скрипту.

anonymous ()
Ответ на: комментарий от slon

Вот интересно, как это соотносится с озвученным в начале требованием «метки по горизонтали рисовались наклонно» и «отрисовать в векторную или растровую картинку»? Видимо, только один человек тут прочитал и осознал исходный посыл.

moroz ()
Ответ на: комментарий от anonymous

Да, все работает, понадобилось всего лишь скачать rpm pycairo и распаковать его в .local/... Спасибо! Немного подрихтую и можно заиспользовать.

Но я был уверен, что полно готовых средств для этого. Во всяких бенчмарках регулярно такие, довольно однотипные, таблички вижу, вряд ли их руками рисуют. Даже любопытно.

moroz ()
Ответ на: комментарий от moroz

таблички вижу, вряд ли их руками рисуют

Ясен пень, генерируют при помощи скриптов на баше, а потом латехом компиляют.

anonymous ()
Ответ на: комментарий от moroz

Пожалуйста )

Возможно что используют какие-то шаблоны в экселях или в том же хтмл.

anonymous ()

Попробуй библиотеку BPrinter (основана на Boost.Spirit). Правда, она рисует границы таблицы.

#include <bprinter/table_printer.h>

using namespace bprinter;
TablePrinter tp(&std::cout);
tp.AddColumn("Name", 25);
tp.AddColumn("Age", 5);
tp.AddColumn("Position", 30);
tp.AddColumn("Allowance", 9);

tp.PrintHeader();
tp << "Dat Chu" << 25 << "Research Assistant" << -0.00000000001337;
tp << "John Doe" << 26 << "Too much float" << 125456789.123456789;
tp << "John Doe" << 26 << "Typical Int" << 1254;
tp << "John Doe" << 26 << "Typical float" << 1254.36;
tp << "John Doe" << 26 << "Too much negative" << -125456789.123456789;
tp << "John Doe" << 26 << "Exact size int" << 125456789;
tp << "John Doe" << 26 << "Exact size int" << -12545678;
tp << "John Doe" << 26 << "Exact size float" << -1254567.8;
tp << "John Doe" << 26 << "Negative Int" << -1254;
tp << "Jane Doe" << bprinter::endl();
tp << "Tom Doe" << 7 << "Student" << -M_PI;
tp.PrintFooter();

Deathstalker ★★★★★ ()
Ответ на: комментарий от moroz

Шутишь? Это сколько нужно иметь времени и выделять его лорчику, чтобы еще топики читать. Тред не читал.

slon ()

Ага, в Latex можно тоже такое сделать. Но Latex - это не то решение, которое я тут искал (слишком тяжелый, у меня аскетичный RHEL 6 инстанс без рутовых прав; да и не знаю я латеха, без tex.stackexchange я бы вряд ли дошел до решения). Тем не менее, полезно знать на будущее.

Пример Latex: http://i.stack.imgur.com/zQ6Z3.png

Рецепты: http://tex.stackexchange.com/questions/32683/rotated-column-titles-in-tabular http://tex.stackexchange.com/questions/98388/how-to-make-table-with-rotated-t...

Замечательный аноним написал небольшую программу на Python, которой я, скорее всего, и воспользуюсь. Огромное ему спасибо! Вот, что получается: https://imgur.com/a/C2Cr1

Еще раз для всех, кто увлеченно предлагал рисовать текстовые таблицы: вся проблема в том, что названия столбцов и строк гораздо длиннее значений в ячейках. Поэтому эти названия надо рисовать под углом (иначе таблица станет нечитаемо большой). А результатом должна стать картинка, которую можно приаттачить в Jira и остальном энтерпрайз монстрятнике.

moroz ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.