我有一个包含几百个坐标点的数据结构,如下所示:
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 ++
答案 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()
,我认为 - 并使用正则表达式来获取数字。在实际表达中应该有很多例子。正则表达式是一个很好的类。只要您想要的就是数字,这将是真正的动态。标签,字符串 - 完全被忽略。