0

我的教授给全班举了一个 C# 的例子,可以用来从文本文件中分割数据。我正在尝试将它用于涉及拆分 txt 内容的项目。文件分成 4 个数组或字段。这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

class Program
{
    static void Main()
    {
        int i = 0;
        foreach (string line in File.ReadAllLines("census.txt"))
        {
            string[] parts = line.Split(',');
            foreach (string part in parts)
            {
                Console.WriteLine("{0}",

                    part);
            }
            i++; 
        }
    }
}

这是census.txt

21,f, s, 14

41,f, m, 22

12, m, s, 12

11, f, s, 8

29, m, m, 4

6, m, s, 12

9, f, s, 2

30, f, s, 1

它应该是按年龄、性别、婚姻状况和地区划分的假设人口普查数据。我不断得到的输出是单行中的每个数字或字符,如下所示:

21

f

s

14

41

f

m

22

等等。

我认为这意味着它正在工作,但我想知道如何使用它进入 4 个并行数组。我还想了解更多关于将其拆分为 4 个字段、结构或类的信息。该项目的下一部分涉及每次出现某个年龄编号或地区编号时进行计数,这将涉及大量数组。

4

4 回答 4

1

我会扩展irsog的答案:

  • 使用类而不是结构
  • 使用属性而不是字段
  • 使用GenderMaritalStatus枚举而不是纯字符串

代码:

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

public enum MaritalStatus
{
    Single, Married
}

public enum Gender
{
    Male, Female
}

和用法:

var people = new List<Person>();

foreach (string line in File.ReadAllLines("Input.txt"))
{
    string[] parts = line.Split(',');

    people.Add(new Person()  {
        Age = int.Parse(parts[0]),
        MaritalStatus = parts[1] == "s" ? MaritalStatus.Single : MaritalStatus.Married,
        Gender = parts[2] == "m" ? Gender.Male : Gender.Female,
        District = int.Parse(parts[3])
    });
}
于 2013-04-07T09:13:21.087 回答
1

这是旧线程,但正如谷歌在前几页中显示的那样,我决定发送我的评论。我强烈建议不要使用给定的 txt 文件格式,因为它不能防错。如果 census.txt 不能保证是理想的,特别是如果它应该由某个第三方(用户、管理员、任何人)创建,那么我强烈建议记录以一些符号结尾,例如:21,f,s , 14;

41,f,m,22;然后我们要做的第一件事 - 我们得到记录数组,如下所示:

字符串[] 行 = text.split(';');

然后简单地再次拆分 - 这次是为了获取记录元素。

foreach(行中的字符串记录)

{

字符串[] 字段 = record.split(',');

}

这样不仅更容易读取记录/字段,而且您可以轻松检查文件的一致性,忽略错误(空记录),检查每条记录中的字段数等。

于 2019-05-08T20:00:28.653 回答
0

您可以为所需信息制作结构:

public struct Info
{
    public int Age;
    public string gender;
    public string status;
    public int district;
}

并将数据插入到您的结构列表中:

  List<Info> info = new List<Info>();
    foreach (string line in File.ReadAllLines("census.txt"))
    {
        string[] parts = line.Split(',');

            info.Add(new Info() {Age=int.Parse(parts[0]), gender=parts[1], status=parts[2], district=int.Parse(parts[3]) });
    }

现在你有一个人员信息列表。

于 2013-04-07T09:08:06.203 回答
0

通用列表(如此处其他 2 个当前答案中使用的)是最好的方法。但是,如果您需要将数据保存在数组中(正如您之前的问题似乎表明的那样),那么您可以像这样修改教授的代码:

C#

int[] districtDataD = new int[900];
string[] districtDataG = new string[900];
string[] districtDataM = new string[900];
int[] districtDataA = new int[900];

int i = 0;
foreach (string line in File.ReadAllLines("census.txt"))
{
    string[] parts = line.Split(',');

    districtDataD[i] = int.Parse(parts[0]);
    districtDataS[i] = parts[1];
    districtDataM[i] = parts[2];
    districtDataA[i] = int.Parse(parts[3]);
    i++;
}

VB.NET(因为你原来的问题是用 VB.NET 标记的):

Dim districtDataD() As New Integer(900)
Dim districtDataS() As New String(900)
Dim distrcitDataM() As New String(900)
Dim districtDataA() As New Integer(900)

Dim i As Integer = 0

For Each Dim line As String In File.ReadAllLines("census.txt")
    Dim string() As parts = line.Split(',')

    districtDataD(i) = Integer.Parse(parts(0))
    districtDataS(i) = parts(1)
    districtDataM(i) = parts(2)
    districtDataA(i) = Integer.Parse(parts(3))

    i++
Next

您也可以使用structorclass并拥有一个包含该对象的数组,但看起来您是教授希望您使用 4 个单独的数组。如果可以使用一个,则可以像这样简单地声明数组,例如:

C#

Person[] districtData = new Person[900];

VB.NET

Dim districtData() As New Person(900)

然后您可以在拆分逻辑中执行此操作(请注意,如果说 Distric 和 Age 是您的对象中的整数,您将必须转换或解析它们,如下所示):

C#

districtData[i] = new Person() { District = int.Parse(parts[0]), Gender = parts[1], MaritalStatus = parts[2], Age = int.Parse(parts[3]) };

VB.NET

districtData[i] = new Person() With { .District = Integer.Parse(parts[0]), .Gender = parts[1], .MaritalStatus = parts[2], .Age = Integer.Parse(parts[3]) }

这段代码有一个风险,如果你有超过 900 行数据,你会得到一个索引超出范围的异常。避免这种情况的一种方法是使用 while 循环修改我在上面放置的代码,该循环检查目标数组的边界或未超过的行数,如下所示:

C#

string[] lines = File.ReadAllLines("census.txt");
int i = 0;

while (i < 900 && i < parts.Length)
{

    // split logic goes here
}

VB.NET

Dim lines As String() = File.ReadAllLines("census.txt")
Dim i As Integer = 0

While (i < 900 AndAlso i < lines.Length)

    ' split logic goes here
End While

我还没有测试过代码,但如果你必须使用数组,这希望能对你有所帮助。

于 2013-04-07T17:58:09.503 回答