3

ID名と場所という3つのフィールドを持つメモ帳(.txt)ファイルがあります。streamreader を使用して C# でこのデータを読み取り、ファイルに ID があるかどうかの状態を確認したいと考えています。はいの場合、その行を出力elseエラーとして取得する必要があります。

次のフィールドを持つ次のtxtファイルがあるとします

00125  JAMES  LONDON
00127  STARK  USA
00128  ARNOLD AUSTRALIA

今、私はそこにIDを入力するようにユーザーに依頼する必要があります. Id が一致する場合、その特定の行を出力として取得する必要があります。たとえば、ユーザーが 00127 を入力すると、次のように出力されます。

00127 JAMES LONDON

データがデータベースに保存されていれば、これは非常に簡単だったでしょう。しかし、データが .txt ファイルに保存されている場合はどうでしょう。

前もって感謝します

4

3 に答える 3

1

最も簡単な解決策 (ID の形式が 5 桁に固定されていると仮定します):

var users = File.ReadAllLines("data.txt")
                .ToDictionary(line => line.Substring(0, 5));

行を値として、ID をキーとして辞書を作成します。使用法:

string line = users["00125"]; // 00125  JAMES  LONDON

それが最も簡単な解決策でした。しかし、実際には、次のようなクラスを紹介します。

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }

    public static User Parse(string s)
    {
        var parts = s.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);
        return new User {
            Id = Int32.Parse(parts[0]),
            Name = parts[1],
            Location = parts[2]
        };
    }

    public override string ToString()
    {
        return String.Format("{0:00000} {1} {2}", Id, Name, Location);
    }
}

次に、各行を解析し、ユーザーを type の辞書に入れますDictionary<int, User>。これにより、コードが強く型付けされ、保守が容易になります。

var users = File.ReadAllLines("data.txt")
                .Select(line => User.Parse(line))
                .ToDictionary(u => u.Id);

var user = users[127];
string name = user.Name; // STARK
Console.WriteLine(user); // 00127 STARK USA
于 2013-02-28T15:11:21.590 に答える
0

いくつかのオプションがあります:

  • リクエストを受け取るたびに血まみれのファイルを読んでください。ファイルが小さく、リクエストが頻繁でない場合、これはうまく機能します。行ごとに読みid、ユーザーのid. 実装は非常に高速ですが、リソースの使用率は非常に低くなっています。実行時の複雑さは O(N) です。最悪の場合、ファイル全体をスキャンする必要があります。

  • 最初のオプションを変更して、キャッシュのレイヤーを追加できます。同じ に対して頻繁にクエリをid取得すると、パフォーマンスが大幅に向上します。実行時の複雑さは依然として O(N) です。最悪の場合、ファイル全体をスキャンする必要があります。そして、これはまだ高速には程遠いです。

  • ファイルidsを一度ソートしてみることもできます。最良のアルゴリズムでは、これには時間がかかりますこれは、データの前処理にO(N x Log(N)費やす時間です。ただし、に基づく二分探索を使用すると、任意の読み取りクエリを実行できます。O(Log(N))id

コード スニペットをお探しの場合はStreamReaderTextReader, StreamWriter, ,binary searchを検索しquick sortます。野生にはたくさんのサンプルがあります...

于 2013-02-28T15:06:44.573 に答える
0

を使用しStreamReaderて、ファイルから内容を読み取ることができます。

次に、をString使用して分割できますSplit

これにより、すべての項目を 2 次元配列に追加できます。次に、配列は次のようになります{{00125, JAMES, LONDON}, {00127, STARK, USA}, {00128, ARNOLD, AUSTRALIA}}。それを使用して、入力をすべての配列の最初のエントリと比較し、それに応じてデータを返すことができます。

これにより、これから進むべき道が明確になるはずです。

于 2013-02-28T15:01:38.247 に答える