0

プレーン テキスト ファイルを生成するプログラムがあります。構造(レイアウト)は常に同じです。例:


テキストファイル:

LinkLabel
"Hello, this text will appear in a LinkLabel once it has been
added to the form. This text may not always cover more than one line. But will always be surrounded by quotation marks."
240, 780

したがって、そのファイルで何が起こっているかを説明するには:

Control
Text
Location


また、フォームのボタンがクリックされ、ユーザーが OpenFileDialog ダイアログからこれらのファイルの 1 つを開くと、各行を読み取ることができる必要があります。上から始めて、それがどのようなコントロールかを確認し、2 行目から始めて、引用符内のすべてのテキストを取得できるようにする必要があります (1 行以上のテキストであるかどうかに関係なく)。次の行 (閉じ引用符の後) で、場所 (240, 780) を抽出する必要があります。 、それはあまり意味がなく、うまくいかない方法を考え出すことになります。

誰もこれをやったことがありますか?私がこれを行う方法について、誰かが助け、提案、またはアドバイスを提供できますか?

私はCSVファイルを調べましたが、とても単純に見えるものには複雑すぎるようです.

ありがとう

4

4 に答える 4

2

これらの問題を解決する方法であるアルゴリズムを書き留めてみます(コメントで):

// while not at end of file
  // read control
  // read line of text
  // while last char in line is not "
    // read line of text
  // read location

各コメントの内容を実行するコードを試してみてください。そうすれば、それを理解できるはずです。

HTH。

于 2009-09-30T06:43:45.603 に答える
2

正規表現を使用して、テキストから行を取得できます。

MatchCollection lines = Regex.Matches(File.ReadAllText(fileName), @"(.+?)\r\n""([^""]+)""\r\n(\d+), (\d+)\r\n");
foreach (Match match in lines) {
   string control = match.Groups[1].Value;
   string text = match.Groups[2].Value;
   int x = Int32.Parse(match.Groups[3].Value);
   int y = Int32.Parse(match.Groups[4].Value);
   Console.WriteLine("{0}, \"{1}\", {2}, {3}", control, text, x, y);
}
于 2009-09-30T06:47:37.417 に答える
2

パーサーを実装しようとしていますが、そのための最善の戦略は、問題をより小さな部分に分割することです。そして、TextReader行を読み取ることができるクラスが必要です。

メソッドを、、 のReadControl3 つのメソッドに分ける必要があります。各メソッドは、読み取るべき項目のみを読み取り、次のメソッドが取得できる位置に残します。このようなもの。ReadControlTypeReadTextReadLocationTextReader

public Control ReadControl(TextReader reader)
{
    string controlType = ReadControlType(reader);
    string text = ReadText(reader);
    Point location = ReadLocation(reader);
    ... return the control ...
}

もちろん、ReadText は複数の行にまたがるため、最も興味深いものです。TextReader.ReadLine実際には、行が引用符で終わるまで呼び出すループです。

private string ReadText(TextReader reader)
{
    string text;
    string line = reader.ReadLine();
    text = line.Substring(1); // Strip first quotation mark.
    while (!text.EndsWith("\"")) {
        line = reader.ReadLine();
        text += line;
    }
    return text.Substring(0, text.Length - 1); // Strip last quotation mark.
}
于 2009-09-30T06:52:49.203 に答える
1

この種のものはイライラします。概念的には単純ですが、危険なコードになってしまう可能性があります。比較的単純なケースがあります。ファイルごとに 1 つのレコードがあり、レコードが多数ある場合はさらに難しくなり、不適切な形式のレコードを適切に処理したい (C# などの言語用のパーサーを作成することを検討してください。

大規模な問題の場合、次のような文法主導のパーサーを使用できます: link text

複雑さの多くは、ファイルに規則性がないことに起因します。最初のフィールドは nwline で終了し、2 番目は引用符で区切られ、3 番目はコンマで終了します ...

私の最初の推奨事項は、ファイルの形式を調整して、解析が非常に簡単になるようにすることです。あなたがコントロールできるようにファイルを書きます。たとえば、テキストに新しい行を入れないでください。各項目はそれぞれの行にあります。次に、4行を読むだけで、仕事は完了です。

于 2009-09-30T06:48:02.663 に答える