从txt文件中读取文件并将内容放入List <t>

时间:2017-02-26 01:58:06

标签: c# xaml

我的项目文件夹中有一个文件,其中包含Vehicle类中属性的数据。如果该类被硬编码到XAML中,它将如下所示:

  Vehicle v1 = new Car() { Make = "Ford", Model = "Fiesta", Price = 10000, Year = "1999", Colour = "Red", Mileage = 40000, Description = "Lovely red car, 4 wheel, optional steering wheel.", VehicleType = "Car" };
  VehicleList.Add(v1);

我不想对这个类对象进行硬编码,而是希望从.txt文件中读取它,每个部分用逗号分隔,&#39;&#39;并将它们放入每个属性中并将该车辆添加到车辆列表中&lt;&gt; &#39; VehicleList&#39;然后将此新读取列表显示在列表框中。

硬编码和.txt都遵循相同的结构,包含变量名的硬编码和仅包含数据的.txt文件。

这是我到目前为止所看到的,因为你可以看到我尝试使用System.IO但是我对其他方法持开放态度。

        private void Button_Click(object sender, RoutedEventArgs e)
    {
        string location = @"PATH";
        VehicleList = File.ReadAllLines(location).ToList();

        var logFile = File.ReadAllLines(location);
        foreach (var v[i] in logFile) VehicleList.Add(s);
    }
}

1 个答案:

答案 0 :(得分:0)

public static List<Car> FromTextFile(string fileName)
{
    var lines = File.ReadAllLines(fileName);

    var cars = new List<Car>();
    foreach (var line in lines)
    {
        var car = FromLine(line);
        if (car == null)
            continue;

        cars.Add(car);
    }

    return cars;
}

private static Car FromLine(string line)
{
    var values = line.Split(',');

    if (values.Length != 8) // There is no specification on what to do, if the amount of items is not sufficient.
        return null;

    // There is also no specification on what order to use, or how to map the ordering.
    return new Car
    {
        Make = values[0],
        Model = values[1],
        // There is also no specification on how to handle in-correct formats.
        // This assumes the Price property to be type of int.
        Price = int.Parse(values[2]), 
        Year = values[3],
        Colour = values[4],
        // Again; how to handle in-correct formats?
        Mileage = int.Parse(values[5]),
        Description = values[6],
        VehicleType = values[7]
    };
}

此代码应该按照您的描述进行操作。请注意此代码的限制;

  • 它需要一个包含一些行的文件,采用逗号分隔格式。
  • 它要求行包含8个非空项,否则将不会映射这些行。
  • 它假定逗号分隔的项目按此顺序完全;制造,型号,价格,年份,颜色,里程,描述,VehicleType。
  • 它不会处理转换类型的正确格式(例如int)。因为你没有这么问。

请记住,这不是一个理想的代码,但编写得不好。

现在,关于你的代码;

首先,您为线条提供了两个不同的值。我不知道为什么。其中一个应该没问题。

其次,您尝试使用foreach遍历其中一个,但它并没有像这样工作。您不能从foreach循环中提供或获取索引。正确的是foreach (TYPE VARIABLE_NAME in COLLECTION)。所以你的代码是foreach (var v /* not v[i] */ in logFile) // ..

然后将其添加到再次包含这些分隔行的列表中。在一天结束时,您有一个包含相同行两次的列表。你应该在添加部分中做的是,你应该将线转换为Car对象。现在你如何做到这一点,绝对取决于你。这个问题在我脑海中浮现,当任务是将字符串集合映射到对象时。

  • 如果某些成员不存在,我该怎么办? (即当行中有5个项目时,即使我们有8个属性)
  • 我如何知道要映射第i个项目的属性?什么是订购?我是从&#34; Columns&#34;线?我只想假设一些我的愿望吗?如果用户不遵守这些规则,我该如何处理?
  • 如果某些成员的格式有问题,我该怎么办?

现在,这不是一个非常常见的问题。每个人都需要以某种方式将数据从位置A传输到位置B.对于您的特定实例,它是从磁盘存储到内存,以对象的形式。

人们如何解决这些问题?他们发明了通用的方法&#34;序列化&#34;和#34;反序列化&#34;。有什么例子?我所想到的最知名的和最常用的是XML(可扩展标记语言)和JSON(JavaScript Object Notation)。这些实际上做了什么?它们将编程对象序列化为非二进制字符串格式。以下是Car类的XML输出示例。

<?xml version=\"1.0\" encoding=\"utf-16\"?>
<Car xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
  <Make>Ford</Make>
  <Model>Fiesta</Model>
  <Price>10000</Price>
  <Year>1999</Year>
  <Colour>Red</Colour>
  <Mileage>40000</Mileage>
  <Description>Lovely red car, 4 wheel, optional steering wheel.</Description>
  <VehicleType>Car</VehicleType>
</Car>

使用这个简单的代码生成;

var car = new Car
{
    Make = "Ford",
    Model = "Fiesta",
    Price = 10000,
    Year = "1999",
    Colour = "Red",
    Mileage = 40000,
    Description = "Lovely red car, 4 wheel, optional steering wheel.",
    VehicleType = "Car"
};

var serializer = new XmlSerializer(typeof(Car));

// https://stackoverflow.com/questions/2434534/serialize-an-object-to-string
using (StringWriter textWriter = new StringWriter())
{
    serializer.Serialize(textWriter, car);
    var output = textWriter.ToString();
}

这就是,如果文本格式正确,您将如何从文本文件中轻松阅读&#34; Car&#34;

var serializer = new XmlSerializer(typeof(List<Car>));
// If your file should contain one car and one car only, you should change the above line to;
// var serilizer = new XmlSerializer(typeof(Car));

using (var reader = File.OpenRead(@"PATH"))
{
    var cars = (List<Car>)serializer.Deserialize(reader);
    reader.Close();
}

可以为JSON编写类似的代码。但我认为你明白了。

简而言之,大多数情况下,XML,JSON或类似的通用格式就足够了。如果不是,您可以开发自己的格式。但是逗号分隔的行是一种非常简单的序列化方式。原因正是我的问题(见上文)。而XML,JSON很容易回答这些问题。在大多数情况下,实现也做得很好。

修改

这是一个非常相似的问题的答案。这个问题的答案很可能也会回答你的问题。 How to split csv whose columns may contain ,