如何读取文件中的数据并将行保存到二维表

时间:2019-04-18 18:55:40

标签: c#

我想阅读文件文本。仅将数字和最后一个字母保存到二维数组。文件行(示例):

[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行(以后可能会用新行将文件扩展),但它总是只保存第一行。谢谢

2 个答案:

答案 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,因为后者将所有行一次加载到内存中,而不是一次加载一行。

但是,我发布自己的版本有以下好处:

  • File.ReadLines()与StreamReader具有类似的优点,并且所需的代码更少。
  • 您为定界符变量添加的标签令人困惑
  • RemoveEmptyEntries拆分消除了拆分输出的稀疏性
  • 再次从read函数返回,以节省代码,它还有其他好处。
  • 然后我覆盖了该类的ToString()方法,因此您仍然可以在控制台中看到它的输出。
  • 我将字符串拆分逻辑放入类构造函数中。这不一定比将其保留在read()函数中更好,但是它使您有机会了解类构造函数的工作原理。
  • 我也只是想强调我上面给出的理由。

这是保存文件每一行的类:

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());
}