0

次のような数百の座標点を含むデータ構造があります。

5,234   20,789
8,687   19,576
13,783   12,032
...

X と Y の各値はタブで区切られています。これらの後には、常にテキスト形式の追加情報が続きます。何かのようなもの:

Date and Time: 22.04.2001
Software Version: 4.8.30002.0
....

今のところ、常に正確に 1024 の座標点があります。したがって、1024 行の座標を読み取るだけです。その後、次は追加情報であると単純に想定しているので、文字列に読み込んでいます。

したがって、座標読み出しループは次のようになります。

for(i=0;i<1024;i++)
{
   ReadXvalue();
   DoTab();
   ReadYvalue();
}

ポイントが追加または省略される場合に備えて、これらのファイルを動的に読み取りたいと思います。私が最初に考えたのは、読んでいる記号が数字か文字かを確認することだけでした。数値の場合は、座標点でなければなりません。char の場合は追加情報だと思います。私の意見では、これはどういうわけか汚れているか、少なくとも正しくないと感じています。
これを行うためのクリーンでスマートな方法は何でしょうか?

例、参照、または提案は大歓迎です。

はじめまして、BC++

4

4 に答える 4

2

独自の tryParseCoordinates を作成することもできます。

これを上記と組み合わせて使用​​し、StreamReader各行を個別に処理できます。この方法を使用すると、行間または行内に汚い文字がないことを確認できます。いつものように、アメリカとヨーロッパの小数点記号には注意してください。

たとえば、この完全な例。

internal class Program
{
    private static void Main(string[] args)
    {
        double x, y;
        if (tryParseCoordinates("3,6\t2,4", out x, out y))
        {
            Debug.WriteLine(string.Format("X: {0}, Y:{1}",
                                          x.ToString(CultureInfo.InvariantCulture),
                                          y.ToString(CultureInfo.InvariantCulture)));
        }
    }

    private static bool tryParseCoordinates(string line, out double X, out double Y)
    {
        X = 0.0;
        Y = 0.0;

        string[] coords = line.Split(new[] {'\t'}, StringSplitOptions.RemoveEmptyEntries);
        if (coords.Length != 2)
        {
            return false;
        }

        bool xOk = double.TryParse(coords[0], out X);
        bool yOk = double.TryParse(coords[1], out Y);
        return xOk && yOk;
    }
}

私はヨーロッパのシステムを使用しているため、小数点としてコンマを使用していることに注意してください。

于 2012-05-15T13:43:45.000 に答える
1

この例を確認してください:http://www.dotnetperls.com/readline

SteamReader興味のあるファイルの受け渡しを開きます。次にReadLine、次の行を読み取ることができるので、1024をコードにハードコーディングする必要はありません。次に、各行を個別に処理できます。

また、 `DoTab'の代わりに、String.Splitを確認してください。http://msdn.microsoft.com/en-us/library/ms228388(v = vs.80)のように、タブで分割することもできます。 aspx

于 2012-05-15T13:32:57.143 に答える
1

(x, y) のような固定長の列がある場合、これはテキスト ファイルを読み取るためのより適切な方法だと思います

   public DataTable GetDataTableFromTextFile(string filepath) 
    {
                                string line;
                                DataTable dt = new DataTable();                         
                                using (TextReader tr = File.OpenText(filepath))
                                {
                                    while ((line = tr.ReadLine()) != null)
                                    {
                                        string[] items = line.Split('\t');
                                        if (dt.Columns.Count == 0)
                                        {
                                            dt.Columns.Add(new DataColumn("FirstColumn", typeof(string)));
                                            dt.Columns.Add(new DataColumn("SecondColumn", typeof(string)));
                                            dt.Columns.Add(new DataColumn("ThridColumn", typeof(string)));

                                        }

                                        if (items.Length > 0 && !string.IsNullOrWhiteSpace(items[0].ToString()))
                                        {
                                            dt.Rows.Add(items);                                       
                                        }
                                    }
                                }
    return dt;

}

これがお役に立てば幸いです。

必要なだけ列を追加できます。dt.rows.add(item) は行に列のみを追加します。たとえば、 item に 2 つの項目しかない場合、行は 2 つの列のみで追加されます。

于 2012-05-15T13:52:04.640 に答える
0

また、文字列全体を読み取り、ReadToEnd()正規表現を使用して数値のみを取得することもできます。実際の表現にはたくさんの例があるはずです。正規表現クラスは良いものです。あなたが望むのが数字だけである限り、これは本当にダイナミックです。タブ、文字列 - 完全に無視されます。

于 2012-05-15T14:18:18.607 に答える