试图读取一个.txt文件,该文件包含大小和类型不同的问题数据(即单整数、双/整数/二进制数组(,用于计算实验。通过查看这里和这里的示例,我开发了两个替代代码块,但由于某种原因(我想Trim方法不起作用(,它们不起作用。它给出了"输入字符串的格式不正确"的错误有人让我知道我做错了什么或错过了什么吗?
using System;
using System.IO;
namespace Program
{
class Program
{
// Basic parameters
private static int x, y, z;
private static double[,] array= new double[x, x];
static void Main(string[] args)
{
string fileName = "LUU1_5.txt";
ReadFile(fileName);
}
static void ReadFile(string sourcefile)
{
using (TextReader reader = File.OpenText(sourcefile))
{
// Method-1 Read line by line
//x= int.Parse(reader.ReadLine());
//y= int.Parse(reader.ReadLine());
//z= int.Parse(reader.ReadLine());
//int k=0;
//for (int row2 = 3; row2 < 3 + 1 + x; row2++)
//{
// k = 0;
// foreach (var row2 in reader.ReadLine())
// {
// foreach (var col in row2)
// {
// Console.WriteLine(col.Trim());
// //array[row2 - 3, k] = double.Parse(col.Trim()); //
// k++;
// }
// }
//}
// Method 2-Read All Lines
String[] content = File.ReadAllLines(sourcefile);
x= int.Parse(content[0]);
y= int.Parse(content[1]);
z= int.Parse(content[2]);
int j = 0;
for (int row = 3; row < 3 + 1 + x; row++)
{
j = 0;
foreach (var col in content[row].Trim().Split(" "))
{
Console.WriteLine(content[row]);
Console.WriteLine(col);
Console.WriteLine(col.Trim()); // using console for monitoring the output
Console.WriteLine(content[row].Trim().Split(" "));
array[row - 3, j] = double.Parse(col.Trim());
//array[row-3, j] = double.TryParse(col.Trim(), out array[row-3, j]);
j++;
}
}
// Then the program reads the next 0-1 array starting line 10.
reader.Close();
}
}
}
}
数据文件如下所示:
5
2
100000
0 46.1 33.53 48.37 44.82 47.8
46.1 0 15.65 21.38 42.05 85.48
33.53 15.65 0 17.2 45.18 77.62
48.37 21.38 17.2 0 60.64 94.26
44.82 42.05 45.18 60.64 0 57.08
47.8 85.48 77.62 94.26 57.08 0
0 1 0 0 0 0
0 0 1 1 1 1
0 0 0 1 1 1
0 0 0 0 1 1
0 0 0 0 0 1
0 0 0 0 0 0
此外,在本实验的后期,我将读取更大的数据文件,如500x500或1000x1000的array-x,你认为我有速度或内存问题吗?我应该使用哪种方法(逐行或所有行合一(?我现在想相应地设计读取块。
提前感谢!
我认为最好使用DTO和regex。
public sealed class RowData
{
public RowData(int number, int size = 5)
{
Number = number;
Items = new List<float>(size);
}
public int Number { get; private set; }
public List<float> Items { get; set; }
public override string ToString()
{
return $"{Number}:{string.Join(" ",Items)}";
}
}
static void ReadFile(string fileName)
{
var regex = new Regex("[\d\.]+");
var list = new List<RowData>();
using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (var sr = new StreamReader(stream, Encoding.UTF8))
{
string line;
var number = 0;
int x =0;
int y = 0;
int z = 0;
while ((line = sr.ReadLine()) != null)
{
switch (number)
{
case 0:
x = int.Parse(line);
break;
case 1:
y = int.Parse(line);
break;
case 2:
z = int.Parse(line);
break;
default:
var rowData = new RowData(number - 3);
var matches = regex.Matches(line);
foreach (Match match in matches)
{
var value = match.Value;
if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator != ".")
value = value.Replace(".", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
rowData.Items.Add(float.Parse(value));
}
list.Add(rowData);
break;
}
number++;
}
}
}
foreach (var rowData in list)
{
Console.WriteLine(rowData.ToString());
}
}