无法使用流阅读器读取文本文件并将txt放入自定义类

时间:2018-08-02 04:21:13

标签: c# forms winforms class streamreader

所以我试图从txt文件中读取文本,然后将文本添加到自定义类列表中,

代码是

public static List<BookInfo> LoadCSVFile(string fileName, out string qError)
    {
        qError = "";
        fileName = "books.txt";
        List<BookInfo> Book_Info = new List<BookInfo>();
        StreamReader read = null;

        try
        {
            read = new StreamReader(fileName);
            while (!read.EndOfStream)
            {
                string line = read.ReadLine();
                string[] values = line.Split(',');
                if (values.Length == 3)
                {
                    string Title = values[0].Trim();
                    string Author = values[1].Trim();
                    string ISBN = values[2].Trim();

                    try
                    {
                        Book_Info.Add(new BookInfo(Title, Author, ISBN));
                    }
                    catch (Exception ex)
                    {
                        qError = ex.Message;
                        return null;
                    }
                }
                else
                {
                    qError = $"line {line} was unable to be read";
                    return null;
                }
            }
        }
        catch
        {
            qError = $"failed to open file: {fileName}";
            return null;
        }
        finally
        {
            if (read != null)
            {
                read.Close();
            }
        }
        if (qError == "")
        {
            return Book_Info;
        }
        return null;
    }

一旦我阅读了文本,它将以我认为正确编码的形式显示

我放置了一条错误消息,以显示何时已读取文件,并且每次尝试新操作都会出现相同的错误。

阅读txt文件时我在哪里出错了?

编辑:

文本文件是使用Visual Studio创建的,并且在相同的解决方案中,文本文件位于bin / debug中

2 个答案:

答案 0 :(得分:3)

我完全同意将军的回答,但是要回答您的第一个问题,我怀疑您的books.txt文件不在您的Bin/Debug文件夹中。 I did test your code ;-P

答案 1 :(得分:2)

一些笔记

  1. 如果您要使用实现IDisposable的东西,那么使用using语句

  2. 始终是一个好习惯
  3. 如果这只是一个小文件,当您仅可以使用File.ReadAllLines

  4. 时,为什么还要打扰StreamReader
  5. Linq是你的朋友,投射是一件很了不起的事。

  6. 如果您真的想解析CSV,请认真考虑专用的CSV解析器库(例如CsvHelper),它将为您省去很多麻烦,很多很多

这并不是完美编码的堡垒,但是我尝试着与您所拥有的以及您所尝试的精神一起工作。

某些Codez

public static List<BookInfo> LoadCSVFile(string fileName, out string qError)
{
   try
   {

      // read all lines in to another type
      // just makes it easier for errors which you seem to want
      var lines = File.ReadAllLines(fileName)
                      .Select(x => new { Values = x.Split(','), Text = x })
                      .ToList();

      // get a list of errors, 
      var errors = lines.Where(x => x.Values.Length != 3)
                        .Select((s, i) => $"Bad book! Line {i} : {s.Text}");

      // return some errors
      qError = string.Join(Environment.NewLine, errors);

      // project lines to your books    
      return lines.Where(x => x.Values.Length == 3)
                  .Select(x => new BookInfo(x.Values[0], x.Values[0], x.Values[0]))
                  .ToList();
   }
   catch (Exception e)
   {
      qError = e.Message;
   }

   return null;
}

免责声明

  • 我通常不会捕获这样的错误,这很讨厌
  • 整个匿名类型和返回的错误有点难闻,如果文件已损坏,则id会抛出一个令人讨厌的异常,并对其进行处理。让用户做正确的事
  • IS 将在您标题中带有逗号的第二次失败
  • 这是完全未经测试的!