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

タブの代わりにスペースが使用されていてもかまいません。伸縮性のあるタブストップのように、2 つを組み合わせて使用​​することをお勧めします。

4

1 に答える 1

1

私は最終的に、柔軟なタブストップの形式に大まかに従う関数を自分で作成しましたが、複雑さは必要ありませんでした (私のテーブルはすべて 1 つのブロックであり、各行に等しい列があります)。

align関数で最初のブロックをスローし、2 番目のブロックを返すテスト ケース (および実際のユース ケース) で機能します。

コーヒースクリプトで:

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 に答える