2012-05-15 66 views
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(); 
} 

现在我想读这些文件动态地在积分将被添加或省略的情况。 我的第一个想法是检查我正在阅读的符号是数字还是字符。如果它是一个数字,它必须是一个坐标点。如果它是字符,我认为它是附加信息。在我看来,这是某种程度上的肮脏,或者至少它感觉不对。
干净而明智的做法是什么?

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

映入眼帘,BC ++

回答

1

如果你有你有一个像(X,Y)的固定lenth列的话,我认为这是阅读文本文件

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只有两个项目,那么该行将仅添加两列。

+0

非常感谢!你不可能知道,但立即保存到一个数据表的东西使我的生活更容易在这一刻 –

+0

欢迎亲爱的:) – JSJ

+0

我不明白的是为什么你在这里添加3个DataColumns。我想我只需要2一个用于X和一个用于Y. –

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

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

+0

不知何故,这个关键字不适合我。 tryParseCoordinates(line,out X,out Y)--->“DataHandler.tryParseCoordinates(string,out double,out double)'的最佳重载方法匹配项有一些无效参数 –

+1

@bodycountPP修正了它 – Davio

0

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