8

ファイルからキーと値のペアのリストを読み取り、に書き込むための小さなクラスを作成していDictionary<string, string>ます。このファイルの形式は次のとおりです。

key1:value1
key2:value2
key3:value3
...

これは非常に簡単なはずですが、ユーザーがこのファイルを手動で編集するので、空白、タブ、余分な行ジャンプなどをどのように処理する必要がありますか?おそらくReplaceを使用して空白とタブを削除できますが、他に欠落している「非表示」の文字はありますか?

または、英数字ではないすべての文字、「:」、および行ジャンプ(行ジャンプは、あるペアを別のペアから分離するものであるため)を削除してから、余分な行ジャンプをすべて削除することもできます。この場合、「一部を除くすべて」の文字を削除する方法がわかりません。

もちろん、「key1:value1:somethingelse」のようなエラーをチェックすることもできます。しかし、それは明らかにユーザーのせいであり、「無効な形式」というメッセージを表示するだけなので、そのようなことはそれほど重要ではありません。基本的なことを処理してから、他に問題が発生した場合に備えて、すべてをtry/catchブロックに入れたいと思います。

注:キーまたは値の内部であっても、空白はまったく必要ありません。

4

7 に答える 7

17

私は最近これを行いましたが、文書化されていないガベージが多すぎて、フィードに不正なxmlが含まれていることにようやく腹を立てました。ASCIIテーブルのスペースと〜の間にないものはすべて効果的に削除されます。

static public string StripControlChars(this string s)
{
    return Regex.Replace(s, @"[^\x20-\x7F]", "");
}

すでに投稿されている他の正規表現の例と組み合わせると、目的の場所に到達するはずです。

于 2011-03-14T19:23:23.390 に答える
7

Regex(正規表現)を使用すると、1つの関数ですべてを除外できます。

string newVariable Regex.Replace(variable、@ "\ s"、 "");

これにより、空白、非表示の文字、\ n、および\rが削除されます。

于 2011-03-14T19:16:34.903 に答える
4

定期的に私たちを噛む「白い」スペースの1つは、壊れないスペースです。また、私たちのシステムは、はるかに制限の厳しいMS-Dynamicsと互換性がある必要があります。最初に、8番目のビット文字を対応するおよそ7番目のビットにマップする関数を作成し、次にDynamicsインターフェイスによってさらに制限されたx20からx7fの範囲にないものをすべて削除しました。

Regex.Replace(s, @"[^\x20-\x7F]", "")

その仕事をする必要があります。

于 2011-03-14T19:30:48.983 に答える
2
var split = textLine.Split(":").Select(s => s.Trim()).ToArray();

Trim()関数は、無関係な空白をすべて削除します。これにより、キーまたは値の内部に空白が保持されることに注意してください。これは、個別に検討することをお勧めします。

于 2011-03-14T19:17:16.227 に答える
2

string.Trim()空白文字を削除するために使用できます。

var results = lines
        .Select(line => {
            var pair = line.Split(new[] {':'}, 2);
            return new {
                Key = pair[0].Trim(),
                Value = pair[1].Trim(),
            };
        }).ToList();

ただし、すべての空白を削除する場合は、正規表現を使用できます。

var whiteSpaceRegex = new Regex(@"\s+", RegexOptions.Compiled);
var results = lines
        .Select(line => {
            var pair = line.Split(new[] {':'}, 2);
            return new {
                Key = whiteSpaceRegex.Replace(pair[0], string.Empty),
                Value = whiteSpaceRegex.Replace(pair[1], string.Empty),
            };
        }).ToList();
于 2011-03-14T19:18:05.347 に答える
2

要件があいまいすぎます。検討:

「スペースはいつ値ですか?キーですか?」
「区切り文字はいつ値ですか?キーですか?」
「タブはいつ値ですか?キーですか?」
「値のコンテキストで区切り文字が使用されている場合、値はどこで終了しますか?キー」?

これらの問題により、コードが1回限りでいっぱいになり、ユーザーエクスペリエンスが低下します。これが私たちが言語規則/文法を持っている理由です。

簡単な文法を定義し、当て推量のほとんどを取り除きます。

"{key}": "{value}"、

ここでは、キーと値のペアが引用符で囲まれ、区切り文字(、)で区切られています。無関係な文字はすべて無視できます。XMLを使用することもできますが、これは技術の少ないユーザーを怖がらせる可能性があります。

引用符は任意であることに注意してください。エスケープをあまり必要としないセットコンテナと自由に交換してください(複雑さに注意してください)。

個人的には、これを単純なUIにまとめて、データをXMLとしてシリアル化します。これをしないこともありますが、あなたは私にそうしない理由を与えてくれません。

于 2011-03-14T19:23:05.110 に答える
0

高速である必要がない場合は、LINQを使用できます。

string clean = new String(tainted.Where(c => 0 <= "ABCDabcd1234:\r\n".IndexOf(c)).ToArray());
于 2011-03-14T19:18:25.393 に答える