0

我有一些制表符分隔的数据,并希望它在具有固定宽度字体的列中很好地排列,所以......

Head 1  Head2   Head 3
Item on is quite long   Item 2  Item 3

变成...

Head 1                  Head2   Head 3
Item on is quite long   Item 2  Item 3

我不介意是否使用空格而不是制表符,并且最喜欢两者的混合,而不是像弹性制表位

4

1 回答 1

1

我最终自己制作了一个函数,该函数大致遵循弹性制表位的格式,但没有我不需要的复杂性(我的表都是一个块,每行都有相同的列)

它适用于我的测试用例(和我的实际用例),我在函数中抛出第一个块align并返回第二个块。

在 CoffeeScript 中:

align = (d)->
    b = []
    l = []
    $.each d.split(/\n/), ->
        a = []
        $.each this.split(/(\t+|\s\s+)/), ->
            if this.match /\w/
                a.push this.toString()
                if l[a.length-1]? < this.length then l[a.length-1] = this.length
        b.push a

    pad = (txt, len)->
        while (txt.length<len)
            txt += " "
        txt

    o = "\n"
    $.each b, ->
        $.each this, (i)->
            o += pad this.toString(), l[i]
            o += "\t"
        o += "\n"
    o

编译为 javascript:

var align;
align = function(d) {
  var b, l, o, pad;
  b = [];
  l = [];
  $.each(d.split(/\n/), function() {
    var a;
    a = [];
    $.each(this.split(/(\t+|\s\s+)/), function() {
      if (this.match(/\w/)) {
        a.push(this.toString());
        if ((l[a.length - 1] != null) < this.length) {
          return l[a.length - 1] = this.length;
        }
      }
    });
    return b.push(a);
  });
  pad = function(txt, len) {
    while (txt.length < len) {
      txt += " ";
    }
    return txt;
  };
  o = "\n";
  $.each(b, function() {
    $.each(this, function(i) {
      o += pad(this.toString(), l[i]);
      return o += "\t";
    });
    return o += "\n";
  });
  return o;
};
于 2012-07-11T16:43:04.170 回答