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。这都取决于你的要求,你可以只使用两个列。这只是一个参考。