Engee 文档
Notebook

列对齐算法

此示例显示了在Julia编程语言中使用不同类型的对齐方式(左、右、中)跨列实现文本对齐的算法。

导言

列对齐算法用于格式化组织成表格结构的文本数据。 它允许您创建格式精美的表格,其中列相对于彼此对齐。 输出报表、日志、表和其他结构化数据时使用此方法,以提高可读性。 在此示例中,输入数据以文本形式呈现,其中字段由美元符号分隔($), а строки разделены символом новой строки.

Основная часть

Подготовка данных и вспомогательные функции

Исходный текст с разделителями в виде знака доллара

In [ ]:
txt = """Given\$a\$txt\$file\$of\$many\$lines,\$where\$fields\$within\$a\$line\$
are\$delineated\$by\$a\$single\$'dollar'\$character,\$write\$a\$program
that\$aligns\$each\$column\$of\$fields\$by\$ensuring\$that\$words\$in\$each\$
column\$are\$separated\$by\$at\$least\$one\$space.
Further,\$allow\$for\$each\$word\$in\$a\$column\$to\$be\$either\$left\$
justified,\$right\$justified,\$or\$center\$justified\$within\$its\$column.""";

Функции для выравнивания текста разных типов:

In [ ]:
# Выравнивание по левому краю: добавляем пробелы справа
ljust(s, width) = s * " "^max(0, width - length(s))

# Выравнивание по правому краю: добавляем пробелы слева
rjust(s, width) = " "^max(0, width - length(s)) * s

# Выравнивание по центру: добавляем пробелы с обеих сторон
function center(s, width)
  pad = width - length(s)  # количество пробелов для заполнения
  if pad <= 0              # если текст уже шире нужной ширины
    return s               # возвращаем как есть
  else
    pad2 = div(pad, 2)     # количество пробелов слева (половина)
    # возвращаем строку с пробелами слева и справа
    return " "^pad2 * s * " "^(pad - pad2)
  end
end
Out[0]:
center (generic function with 1 method)

Разбор входных данных

Разделяем текст на строки по символу новой строки \n.

Затем каждую строку разделяем по символу $ \text{通过首先删除最终的}$

In [ ]:
parts = [split(rstrip(line, '$'), '$') for line in split(txt, '\n')]
# parts теперь содержит массив массивов слов (строки -> столбцы)
Out[0]:
6-element Vector{Vector{SubString{String}}}:
 ["Given", "a", "txt", "file", "of", "many", "lines,", "where", "fields", "within", "a", "line"]
 ["are", "delineated", "by", "a", "single", "'dollar'", "character,", "write", "a", "program"]
 ["that", "aligns", "each", "column", "of", "fields", "by", "ensuring", "that", "words", "in", "each"]
 ["column", "are", "separated", "by", "at", "least", "one", "space."]
 ["Further,", "allow", "for", "each", "word", "in", "a", "column", "to", "be", "either", "left"]
 ["justified,", "right", "justified,", "or", "center", "justified", "within", "its", "column."]

确定最大列宽

创建一个数组来存储每列的最大宽度

最大列数定义为最大行长度。

In [ ]:
max_widths = zeros(Int, maximum(length, parts));

我们遍历所有行并确定每列的最大宽度。

In [ ]:
for line in parts
  for (i, word) in enumerate(line)
    # Обновляем максимальную ширину для столбца i
    max_widths[i] = max(max_widths[i], length(word))
  end
end   

每列宽度加1,以确保列之间至少有一个空间。

In [ ]:
max_widths .+= 1;

不同类型的对齐结果的形成和输出

In [ ]:
# Проходим по каждому типу выравнивания
for (label, justify) in (("левому краю", ljust), ("правому краю",rjust), ("центру",center))
  # Выводим заголовок для текущего типа выравнивания
  println("Выравнивание по ", label, ":\n")
  
  # Проходим по каждой строке исходных данных
  for line in parts
    # Проходим по каждому слову (столбцу) в строке
    for (j, word) in enumerate(line)
      # Применяем функцию выравнивания к слову с заданной шириной столбца
      print(justify(word, max_widths[j]))
    end
    # Переходим на новую строку после окончания строки данных
    println()
  end
  
  # Выводим разделительную линию из дефисов
  println("-"^sum(max_widths),"\n")
end
Выравнивание по левому краю:

Given      a          txt        file   of     many      lines,     where    fields  within  a      line 
are        delineated by         a      single 'dollar'  character, write    a       program 
that       aligns     each       column of     fields    by         ensuring that    words   in     each 
column     are        separated  by     at     least     one        space.   
Further,   allow      for        each   word   in        a          column   to      be      either left 
justified, right      justified, or     center justified within     its      column. 
---------------------------------------------------------------------------------------------------------

Выравнивание по правому краю:

      Given          a        txt   file     of      many     lines,    where  fields  within      a line
        are delineated         by      a single  'dollar' character,    write       a program
       that     aligns       each column     of    fields         by ensuring    that   words     in each
     column        are  separated     by     at     least        one   space.
   Further,      allow        for   each   word        in          a   column      to      be either left
 justified,      right justified,     or center justified     within      its column.
---------------------------------------------------------------------------------------------------------

Выравнивание по центру:

   Given        a         txt     file    of      many     lines,     where   fields  within    a   line 
    are    delineated     by        a   single  'dollar' character,   write     a    program 
   that      aligns      each    column   of     fields      by     ensuring   that   words    in   each 
  column       are     separated   by     at     least       one     space.  
 Further,     allow       for     each   word      in         a      column     to      be   either left 
justified,    right   justified,   or   center justified   within      its   column. 
---------------------------------------------------------------------------------------------------------

结论

在这个例子中,我们查看了Julia中文本列对齐算法的实现。 我们设法创建了一个程序,该程序接受分隔文本,将其拆分为列,确定每列所需的宽度,并输出具有三种类型对齐方式的格式化文本:左,右和中心。 它对于创建文本格式的可读表和报告非常有用,并且还演示了在Julia中处理文本数据和字符串格式的基础知识。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Align_columns