Как убрать смещенные столбцы в тексте?

Пакет stopit, найденный на pypi, кажется хорошо обрабатывает тайм-ауты.

Мне нравится декоратор @stopit.threading_timeoutable, который добавляет параметр timeout к украшенной функции, что делает то, что вы ожидать, он останавливает функцию.

Проверьте это на pypi: https://pypi.python.org/pypi/stopit

25
задан brian d foy 1 October 2009 в 20:04
поделиться

4 ответа

Presumably you are using printf to output the columns in the first place. You can use extra modifiers in your format string to make sure things get aligned.

  • To print a column of a specific width (right-justified), add the width before the formatting flag, e.g., "%10s" will print a column of width 10. If your string is longer than 10 characters, the column will be longer than you want, so choose a maximum value. If the string is shorter, it will be padded with spaces.
  • To left-justify a column, put a - sign in front, e.g., "%-10s". I like to left-justify strings and right-justify numbers, personally.
  • If you are printing addresses, you can change the fill characters from spaces to zeroes with a leading zero: "%010x".

To give a more in depth example:

printf("%-30s %8s %8s\n", "Name", "Address", "Size");
for (i = 0; i < length; ++i) {
    printf("%-30s %08x %8d\n", names[i], addresses[i], sizes[i]);

This would print three columns like this:

Name                            Address     Size
foo                            01234567      346
bar                            9abcdef0     1024
something-with-a-longer-name   0000abcd     2048
31
ответ дан 28 November 2019 в 17:51
поделиться

Вот решение для awk: c_prog | awk '{printf ("% - 40s% - 40s \ n", $ 1, $ 2); } '

9
ответ дан 28 November 2019 в 17:51
поделиться

Если вы хотите выполнять обработку в Vim (а не исправлять генератор), установите плагин superb align и выполните следующее:

ggVG
\tsp

Первая команда преобразуется в gg (перейти к началу файла), V (перейти в режим визуальной линии), G (перейти в конец файла). В сочетании он визуально выделяет весь файл. \ tsp - это карта выравнивания, которая выравнивается по пробелу.

Если вы предпочитаете делать что-то в командной строке : , вы можете использовать альтернативный разделитель (например, ] ### ) и используйте командную строку Align:

:%s/\s\+/###/g
:%Align ###
:%s/### //g

Он длиннее, но вы можете найти его более логичным / запоминающимся.

В сочетании он визуально выделяет весь файл. \ tsp - это карта выравнивания, которая выравнивается по пробелу.

Если вы предпочитаете делать что-то в командной строке : , вы можете использовать альтернативный разделитель (например, ] ### ) и используйте командную строку Align:

:%s/\s\+/###/g
:%Align ###
:%s/### //g

Он длиннее, но вы можете найти его более логичным / запоминающимся.

В сочетании он визуально выделяет весь файл. \ tsp - это карта выравнивания, которая выравнивается по пробелу.

Если вы предпочитаете делать что-то в командной строке : , вы можете использовать альтернативный разделитель (например, ] ### ) и используйте командную строку Align:

:%s/\s\+/###/g
:%Align ###
:%s/### //g

Он длиннее, но вы можете найти его более логичным / запоминающимся.

4
ответ дан 28 November 2019 в 17:51
поделиться

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

#!/usr/bin/perl
use strict;
use warnings;
my $sep = 2;

sub max {
    my ($a,$b) = @_;
    return $a > $b ? $a : $b;
}

my @rows;
my $cols;
my $max = 0;

while (<>) {
    next if m/^\s*$/;
    my (@cols) = split m'\s+';

    for (@cols) {
        $max = max($max, length);
    }

    $cols = @cols;
    push @rows, \@cols;
}

for (@rows) {
    my $str = join '', (('%-' . ($max+$sep) . 's') x $cols);
    $str .= "\n";
    printf $str, @$_;
}
2
ответ дан 28 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

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