0

我有一个包含数百个坐标点的数据结构,如下所示:

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

每个 X 和 Y 值由 TAB 分隔。它们后面总是以文本形式的附加信息。就像是:

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

现在总是正好有 1024 个坐标点。所以我只是读出了 1024 行的坐标。之后我只是假设接下来是附加信息,所以我将这些内容读到字符串中。

所以坐标读出循环看起来像这样:

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

现在我想动态读取这些文件,以防添加或省略点。我的第一个想法只是检查我正在阅读的符号是数字还是字符。如果它是一个数字,它必须是一个坐标点。如果它是一个字符,我认为它是附加信息。在我看来,这有点脏,或者至少感觉不对。
什么是干净和聪明的方法来做到这一点?

欢迎任何示例、参考或建议。

问候,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 只有两个项目,然后该行将仅添加两列。

于 2012-05-15T13:52:04.640 回答
0

您还可以读取整个字符串 - ReadToEnd(),我认为 - 并使用正则表达式仅获取数字。应该有很多关于实际表达的例子。正则表达式类是一个很好的类。只要您想要的只是数字,这将是真正动态的。制表符、字符串 - 完全被忽略。

于 2012-05-15T14:18:18.607 回答