如何动态地从文本文件中读取数据?

时间:2012-05-15 13:28:24

标签: c# .net

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

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();
}

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

欢迎提供任何示例,参考或建议。

电贺, BC ++

4 个答案:

答案 0 :(得分: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;
    }
}

请注意,我使用的是欧洲系统,因此逗号为小数点。

答案 1 :(得分:1)

查看此示例:http://www.dotnetperls.com/readline

你打开一个SteamReader传递你感兴趣的文件。然后你可以ReadLine读取下一行,这样你就不必将1024硬编码到你的代码中。然后你可以单独处理每一行。

此外,代替“DoTab”,请查看String.Split您还可以在标签页上进行拆分,如下所示:http://msdn.microsoft.com/en-us/library/ms228388(v=vs.80).aspx

答案 2 :(得分:1)

如果您有固定的lenth列(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)将仅添加行中的列,因为它只有两个项目,然后该行将仅添加两列。

答案 3 :(得分:0)

你也可以阅读整个字符串 - ReadToEnd(),我认为 - 并使用正则表达式来获取数字。在实际表达中应该有很多例子。正则表达式是一个很好的类。只要您想要的就是数字,这将是真正的动态。标签,字符串 - 完全被忽略。