2014年12月10日

C#でテキスト行の長さ合わせ

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その55

■問題
改行文字を複数個含むテキストデータを格納する文字列を 最大長の行を除く各行末に指定したパディング文字を適切な数だけ追加して、 すべての行が最大長の行と同じ長さに揃う文字列に変換する 手続あるいは関数を書いてください。
元の文字列の最後は改行です。 行の長さはその行に含まれる(行末の改行を除く)文字の数です。

変換前の文字列例
"○○○○\n○○○○○○○\n\n○○○○○\n"

上の文字列例をパディング文字'☆'を指定して変換した文字列
"○○○○☆☆☆\n○○○○○○○\n☆☆☆☆☆☆☆\n○○○○○☆☆\n"

必須ではありませんが、 テキストデータをトラバースする回数を減らす工夫をすると面白いかもしれません。
         ※ ごめんなさい、出題者がわかりません。

オリジナルの問題のタイトルは、「テキスト行の正規化」なのですが、漠然としているので、「テキスト行の長さ合わせ」としました。

最初に書いたものは、かなり力技のコードです。データが、string[] ではなく、stringだというのが ちょっと厄介ですね。

using System;
using System.Linq;
using System.Text;


namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var s = Padding("○○○○\n○○○○○○○\n\n○○○○○\n",'あ');
            Console.WriteLine(s);
        }

        static string Padding(string text, char p) {
            int maxlength = int.MinValue;
            int length = 0;
            foreach (char c in text) {
                if (c == '\n') {
                    if (maxlength < length)
                        maxlength = length;
                    length = 0;
                } else
                    length++;
            }
            StringBuilder sb = new StringBuilder();
            length = 0;
            foreach (var c in text) {
                if (c == '\n') {
                    sb.AppendLine(new string(p,maxlength-length));
                    length = 0;
                } else {
                    length++;
                    sb.Append(c);
                }
            }
            if (length > 0)
                sb.AppendLine(new string(p, maxlength - length));
            return sb.ToString();
        }
    }
}

入力文字列の最後が必ず \n という前提があれば、最後の if 文は不要です。

次に書いたのは、LINQ to Objectを使ったコード。
効率は無視していますが、上のPaddingメソッドに比べると、随分とすっきりしました。

    static string Padding2(string text, char p) {
        var lines = text.Split('\n');
        int maxlength = lines.Max(t => t.Length);
        int count = lines.Last() == "" ? lines.Length - 1 : lines.Length;
        return lines.Take(count)
                    .Aggregate("", (r, s) => r += s.PadRight(maxlength,p) + '\n');
    }

  

Posted by gushwell at 23:00Comments(0)TrackBack(0)

2010年05月06日

string.Trimの動作が変更された

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET Framework4からString.Trim メソッドの動作が少し変わっているようです。

 

3.5 SP1 以前

.NET 4

ZERO WIDTH SPACE (U+200B) 削除 削除しない
ZERO WIDTH NO-BREAK SPACE (U+FEFF) 削除 削除しない
MONGOLIAN VOWEL SEPARATOR (U+180E) 削除 削除しない
NARROW NO-BREAK SPACE (U+202F) 削除しない 削除
MEDIUM MATHEMATICAL SPACE (U+205F) 削除しない 削除

まあ、僕にはあまり関係なさそうですが...
  
Posted by gushwell at 21:22Comments(0)TrackBack(0)

2010年01月07日

String.PadLeft

   このエントリーをはてなブックマークに追加 Clip to Evernote
MSDNのクラスライブラリリファレンスを見てたら、
こんなメソッドがあるのを知りました。
PadLeftは、文字を右寄せし、指定した文字数になるまで、
左側に空白または指定した文字を埋め込んでくれます。
とすると、
と表示されます。
同様に、PadRight という右側に文字を埋め込むメソッドもあります。
  
Posted by gushwell at 23:33Comments(0)TrackBack(0)