从文件中获取多个数据属性的不同值,并将它们存储在不同的文件中

时间:2017-07-31 11:51:59

标签: c# csv

我的文件包含以下格式的数据记录

 39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K

我希望得到多个属性索引的不同值。例如索引5,6

我实现了一个代码来获取这些不同的值,但只有一个属性。

如何获取多个属性的不同值并将它们存储在一个文件中!

1 个答案:

答案 0 :(得分:0)

您希望首先从输入文件加载行GetEntities,然后转换为内存中格式,执行查询或应用转换GetValues,最后将结果转储到输出文件。 System.LinqSystem.Collections.Generic命名空间一起为您提供了非常强大的API,您应该能够在他们的帮助下完成您所需的一切。 System.IO命名空间中还提供了许多有用的API,用于ReadAllLinesWriteAllLines等文件操作。请参阅下面的代码段。

C#代码段:

static void Main(string[] args)
{
    var entities = GetEntities("data.csv").ToList();

    var columns = new[] { 4, 10 };
    var values = GetValues(entities, columns);
    File.WriteAllLines("4-and-10.txt", values.Distinct());
}

private static IEnumerable<string> GetValues(IEnumerable<Entity> entities, params int[] columns)
{
    var values = new List<string>();
    foreach (var distinctValues in columns.Select(index => GetValues(entities, index).Distinct()))
    {
        values.AddRange(distinctValues);
    }
    return values;
}

private static IEnumerable<Entity> GetEntities(string file, char separator = ',')
{
    return File.ReadAllLines(file).Select(x => new Entity
    {
        Values = x.Split(separator)
            .Select(c => c.Trim())
            .ToArray()
    });
}

public class Entity
{
    public string[] Values { get; set; }
}

从可维护性的角度来看,将Entity类中的数据类型的所有列定义为与输入文件中的列对应的属性可能是个好主意,这样您就可以更清楚地了解数据类型可以将Enums或其他类的引用带到救援中。从逗号分隔格式到更结构化的内存中结构的反序列化通常有助于简化代码并提高可读性,它还将加载数据和查询的问题分开。