我想阅读文件文本。仅将数字和最后一个字母保存到二维数组。文件行(示例):
[4; 5)| [1; 1,5)| B
static void read()
{
string[] lines = System.IO.File.ReadAllLines(@"C:\learning.txt");
int n = lines.Length;
string[ , ] tab = new string[n, 5];
int i = 0;
foreach (string line in lines)
{
Char[] znaki = { '[', ';', ')', '|', ' ' };
string[] names = line.Split(znaki);
// Console.WriteLine(names[1]+"\t"+names[3] + "\t" + names[6] + "\t" + names[8] + "\t" + names[10]);
tab[i, 0] = names[1];
tab[i, 1] = names[3];
tab[i, 2] = names[6];
tab[i, 3] = names[8];
tab[i, 4] = names[10];
i++;
}
Console.ReadKey();
}
我想将数据分成5列和n行(以后可能会用新行将文件扩展),但它总是只保存第一行。谢谢
答案 0 :(得分:1)
为什么不创建对象/ dto?
创建对象:
public class ElementDTO {
public int Number1 {get; set}
public int Number2 {get; set}
public int Number3 {get; set}
public int Number4 {get; set}
public char InputChar {get; set}
}
并通过StreamReader读取文件:
List<ElementDTO> list = new List<ElementDTO>();
using (StreamReader sr = new StreamReader("/path/to/file"){
string line;
while((line = sr.ReadLine()) != null) {
...//here your split code
ElementDTO element = new Element {
Number1 = ...;
Number2 = ...;
Number3 = ...;
Number4 = ...;
InputChar = ....;
};
list.add(element);
}
}
return list.ToArray();
答案 1 :(得分:0)
我正在运行您的代码,但并没有看到它仅会节省一行代码。在这方面正在发生其他事情。
KreLou绝对正确,可以迫使您将这些行放入类实例中。否则,您将失去类型安全性,这意味着与编译时或设计时相反,在运行时会出现许多错误。它还使您代码的用户(包括您自己,以后)将更容易理解对象的用途。
KreLou再次正确,因为StreamReader优于File.ReadAllLines,因为后者将所有行一次加载到内存中,而不是一次加载一行。
但是,我发布自己的版本有以下好处:
这是保存文件每一行的类:
public class learnLine {
static Char[] delimiters = { '[', ';', ')', '|', ' ' };
public int num1 { get; set; }
public int num2 { get; set; }
public int num3 { get; set; }
public int num4 { get; set; }
public string letter { get; set; }
public learnLine (string line) {
string[] parts = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
num1 = Convert.ToInt32(parts[0]);
num2 = Convert.ToInt32(parts[1]);
num3 = Convert.ToInt32(parts[2]);
num4 = Convert.ToInt32(parts[3].Substring(0,1)); // from your logic it seems like you only want the first?
letter = parts[4];
}
public override string ToString () =>
$"contents: {num1}|{num2}|{num3}|{num4}|{letter}";
}
这里是读取行的功能:
IEnumerable<learnLine> read(string path) {
foreach (var line in File.ReadLines(path)) {
yield return new learnLine(line);
}
}
以下是使用函数将结果输出到控制台的方法:
IEnumerable<learnLine> lines = read(@"C:\learning.txt");
foreach(var line in lines) {
Console.WriteLine(line.ToString());
}