Объединить строки переменной длины в виде таблицы

Я извлекаю массив данных из SQL, а затем объединяю их в виде строк для отображения. Функция выглядит так:

function FetchTopStats( Conn, iLimit )
  local sToReturn = "\tS.No. \t UserName \t Score\n\t"
  SQLQuery = assert( Conn:execute( string.format( [[SELECT username, totalcount FROM chatstat ORDER BY totalcount DESC LIMIT %d]], iLimit ) ) )
  DataArray = SQLQuery:fetch ({}, "a")
  i = 1
  while DataArray do
    sToReturn = sToReturn..tostring( i ).."\t"..DataArray.username.." \t "..DataArray.totalcount.."\n\t"
    DataArray = SQLQuery:fetch ({}, "a")
    i = i + 1
  end
  return sToReturn
end

Это дает мне вывод, как:

    S.No.    UserName    Score
    1   aim      6641
    2   time     5021
    3   Shepard      4977

и так далее. Я думаю об использовании string.format функция, чтобы иметь дисплей следующим образом:

    S.No.    UserName    Score
    1       aim          6641
    2       time         5021
    3       Shepard      4977

Но у меня совершенно нет идей о том, как это сделать. Единственный вариант, который мне приходит в голову, - это проверка длины строки имени пользователя, а затем применение \t соответственно. Это я хочу использовать в самом конце.

1 ответ

Решение

Что ж, вам нужно либо определить максимальную длину имени пользователя, что делает алгоритм 2-проходным, либо ограничить его произвольным (но разумным) размером и безоговорочно отрубить хвосты слишком длинных строк. Если у вас есть ширина столбца, вы можете использовать строки формата по левому или правому краю:

> print(string.format("|%-10d|%-20s|%10d|", 1, "Shepard", 9000))
|1         |Shepard             |      9000|

Кроме того, для больших таблиц рассмотрите возможность использования table.concat для построения конечного результата: это значительно быстрее, чем многократное добавление строк (для объяснения обратитесь к Главе 11.6 PIL).

Другие вопросы по тегам