Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从文本文件中动态读取数据?_C#_.net - Fatal编程技术网

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

C# 如何从文本文件中动态读取数据?,c#,.net,C#,.net,我有一个数据结构,它包含几百个坐标点,如下所示: 5,234 20,789 8,687 19,576 13,783 12,032 ... for(i=0;i<1024;i++) { ReadXvalue(); DoTab(); ReadYvalue(); } 每个X和Y值由选项卡分隔。它们后面总是有文本形式的附加信息。比如: Date and Time: 22.04.2001 Software Version: 4.8.30002.0 .... 目前,总

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

5,234   20,789
8,687   19,576
13,783   12,032
...
for(i=0;i<1024;i++)
{
   ReadXvalue();
   DoTab();
   ReadYvalue();
}
每个X和Y值由选项卡分隔。它们后面总是有文本形式的附加信息。比如:

Date and Time: 22.04.2001
Software Version: 4.8.30002.0
....
目前,总有1024个坐标点。所以我只是读出1024行的坐标。之后,我只是简单地假设下面是额外的信息,所以我将这些内容读出字符串

所以坐标读出回路看起来像这样:

5,234   20,789
8,687   19,576
13,783   12,032
...
for(i=0;i<1024;i++)
{
   ReadXvalue();
   DoTab();
   ReadYvalue();
}
for(i=0;i查看此示例:

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

此外,除了“DoTab”,签出还可以在选项卡上拆分,如图所示:

签出此示例:

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


此外,除了“DoTab”,您还可以在选项卡上进行拆分,如图所示:

您甚至可以创建自己的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;
    }
}

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

您甚至可以创建自己的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;
    }
}

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

如果您有固定的长度列,如(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只有两个项,那么该行将只添加两列。

如果您有像(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只有两个项,那么该行将只添加两列。

您还可以读取整个字符串-
ReadToEnd()
,我认为-并且使用正则表达式只获取数字。实际表达式上应该有很多示例。regex类是一个很好的类。这将是真正动态的,只要您只需要数字。选项卡,字符串-完全忽略。

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

不知怎的,这个out关键字对我不起作用。tryParseCoordinates(line,out X,out Y)-->“与'DataHandler.tryParseCoordinates(string,out double,out double)'匹配的最佳重载方法具有一些无效参数。不知何故,此out关键字对我不起作用。tryParseCoordinates(line,out X,out Y)-->“DataHandler.tryParseCoordinates”的最佳重载方法匹配(字符串,输出双精度,输出双精度)'有一些无效的参数。非常感谢!您不可能知道,但立即将内容保存到datatable会让我的生活变得更加轻松。我不明白的是,为什么您要在这里添加3个DataColumns。我想我只需要2个。一个用于X,一个用于Y。这完全符合您的要求,您可以只使用两个列。这只是一个参考erence.非常感谢!你不可能知道,但立即将内容保存到数据表会让我的生活变得更加轻松。我不明白的是,为什么你要在这里添加3个数据列。我想我只需要2个。一个用于X,一个用于Y。这都取决于你的要求,你可以只使用两个列。这只是一个参考。