将文本文件数据排序为数组

时间:2015-03-30 03:10:51

标签: c# arrays sorting

我正在为我的计算机科学课做家庭作业问题。城市人口普查数据位于保存其公民记录的文本文件中。每行将包含由逗号分隔的不同数据类型的四个字段(年龄,性别,婚姻状况和地区)。例如,22,F,M,1。

我该如何处理?我的想法是我应该使用两个1D阵列,一个用于年龄,一个用于区域。我需要能够计算出每个地区有多少人,以及整个城市有多少人处于不同年龄组。

如何读取每一行并获取每个数组中我想要的信息?

编辑** 这是我迄今为止所做的。我试图将我的数据从字段分成四个不同的数组。这就是我被困的地方。

        FileStream fStream = new FileStream("test.txt", FileMode.Open, FileAccess.Read);
        StreamReader inFile = new StreamReader(fStream);

        string inputRecord = "";
        string[] fields;
        int[] ageData = new int[1000];
        string[] genderData = new string[1000];
        string[] maritalData = new string[1000];
        int[] districtData = new int[1000];



        inputRecord = inFile.ReadLine();
        while (inputRecord != null)
        {
            fields = inputRecord.Split(',');

            int i = 0;

            ageData[i] = int.Parse(fields[0]);
            genderData[i] = fields[1];
            maritalData[i] = fields[2];
            districtData[i] = int.Parse(fields[3]);
            i++;

            inputRecord = inFile.ReadLine();
         }

编辑2 **

第一个问题,我已经决定使用以下代码来了解每个地区的人口普查数据中有多少公民。

for (int x = 1; x <= 22; x++)
            for (int y = 0; y < districtData.Length; y++)
                if (districtData[y] == x)
                    countDist[x]++;

        for (int x = 1; x <= 22; x++)
            Console.WriteLine("District   " + x + "   has   " + countDist[x] + "   citizens");

在我的.Writeline x达到两位数时,它会抛弃我的列。我怎样才能更好地排列我的列?

第二个问题,我不太清楚如何使用if语句将我在ageData中的值分成年龄组。

3 个答案:

答案 0 :(得分:2)

听起来四个领域中的每一个都有一些共同之处......它们代表了人口普查调查的人。这是按照

的方式使用课程的好时机
public class Person
{
    public int Age { get; set; }
    public string Gender { get; set; }
    public string MaritalStatus { get; set; }
    public int District { get; set; }
}

然后,只需读入文本文件中的所有行(如果它很小,可以使用File.ReadAllLines()),然后为文件中的每一行创建一个Person实例。

您可以创建

List<Person> people;

保存您从文本文件中解析的Person实例。

由于这些行似乎用逗号分隔,请查看String.Split()

<强>更新

您的编辑尝试非常接近。您不断创建新的i并将其初始化为0.而是在循环之外初始化它:

int i = 0;
while (inputRecord != null)
{
    fields = inputRecord.Split(',');

此外,您可能希望修剪输入的多余空格。如果字段用“,”而不是“,”分隔,则字段中将有多余的空格。

        genderData[i] = fields[1].Trim();
        maritalData[i] = fields[2].Trim();

答案 1 :(得分:0)

这个怎么样?

List<string[]> o = File.ReadAllLines(@"C:\TestCases\test.txt").Select(x => x.Split(',')).OrderBy(y => y[0]).ToList();

每个人都是列表中的字符串数组。 每个属性都是数组中的索引,例如:age是第一个。 上面的代码读取所有行,逗号分隔它们按年龄对它们进行排序,并将它们添加到列表中。

答案 2 :(得分:0)

public static class PersonsManager
{
    public static PersonStatistics LoadFromFile(string filePath)
    {
        var statistics = new PersonStatistics();
        using (var reader = new StreamReader(filePath))
        {
            var separators = new[] { ',' };
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();

                if (string.IsNullOrWhiteSpace(line))
                    continue; //--malformed line

                var lParts = line.Split(separators, StringSplitOptions.RemoveEmptyEntries);
                if (lParts.Length != 4)
                    continue; //--malformed line

                var person = new Person
                {
                    Age = int.Parse(lParts[0].Trim()),
                    Gender = lParts[1].Trim(),
                    MaritalStatus = lParts[2].Trim(),
                    District = int.Parse(lParts[3].Trim())
                };

                statistics.Persons.Add(person);
            }
        }

        return statistics;
    }
}

public class PersonStatistics
{
    public List<Person> Persons { get; private set; }

    public PersonStatistics()
    {
        Persons = new List<Person>();
    }

    public IEnumerable<Person> GetAllByGender(string gender)
    {
        return GetByPredicate(p => string.Equals(p.Gender, gender, StringComparison.InvariantCultureIgnoreCase));
    }

    //--NOTE: add defined queries as many as you need
    public IEnumerable<Person> GetByPredicate(Predicate<Person> predicate)
    {
        return Persons.Where(p => predicate(p)).ToArray();
    }
}

public class Person
{
    public int Age { get; set; }
    public string Gender { get; set; }
    public string MaritalStatus { get; set; }
    public int District { get; set; }
}

用法:

var statistics = PersonsManager.LoadFromFile(@"d:\persons.txt");
var females = statistics.GetAllByGender("F");
foreach (var p in females)
{
    Console.WriteLine("{0} {1} {2} {3}", p.Age, p.Gender, p.MaritalStatus, p.District);
}

我希望它有所帮助。