将文本文件中的数据拆分为并行数组

本文关键字:拆分 并行 数组 数据 文本 文件 | 更新日期: 2023-09-27 18:08:06

我的教授给了我们一个c#的例子,这个例子可以用来从一个文本文件中分割数据。我试图将其用于一个项目,涉及分割文本的内容。文件到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个字段,结构或类的信息。项目的下一部分涉及每次出现特定年龄号码或地区号码时的计数,这将涉及许多数组。

将文本文件中的数据拆分为并行数组

我将扩展一下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])
    });
}

这是一个老话题,但由于谷歌在前几页中显示了它,我决定发送我的评论。我强烈建议不要给出txt文件格式,因为它不是错误证明。如果不能保证census.txt是理想的,特别是如果它应该是由一些第三方(用户,管理员,任何人)创建的,那么我强烈建议记录以一些符号结束,像这样:

41,f, m, 22;然后我们要做的第一件事-我们得到记录数组,像这样:

string[] lines = text.split(';');

,然后简单地再次分割-这一次得到记录元素。

foreach (string record in lines)

{

string[] fields = record.split(',');

}

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

一个通用列表(就像在这里的其他两个当前答案中使用的那样)是最好的方法。但是,如果您需要以数组的形式保存数据(正如您前面的问题所表明的),那么您可以像这样修改教授的代码:

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

你也可以使用structclass,并使用一个数组来保存该对象,但看起来你的教授希望你使用4个单独的数组。如果可以使用数组,可以简单地像这样声明数组,例如:

c#

Person[] districtData = new Person[900];

VB。净

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。净

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。净

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

我还没有测试过代码,但如果您必须使用数组,那么这将有望对您有所帮助。

您可以为所需信息创建一个结构:

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]) });
    }

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