我的教授为课程提供了一个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个字段,结构或类的信息。该项目的下一部分涉及每次出现某个年龄编号或地区编号时计数,并且涉及大量阵列。
答案 0 :(得分:1)
我会稍微扩展 irsog 的答案:
Gender
和MaritalStatus
枚举代替普通字符串代码:
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])
});
}
答案 1 :(得分:1)
这是旧线程,但是正如google在前几页中显示的那样,我决定发送评论。我强烈建议您不要使用给定的txt文件格式,因为它不能防错。如果不能保证census.txt是理想的,尤其是假设它是由某些第三方(用户,管理员,任何人)创建的,那么我强烈建议记录以某些符号结尾,例如: 21,f,s,14;
41,f,m,22; 然后我们要做的第一件事-我们得到记录数组,像这样:
string [] lines = text.split(';');
然后简单地再次拆分-这次获取记录元素。
foreach(行中的字符串记录)
{
string []字段= record.split(',');
}
这样,不仅可以轻松读取记录/字段,还可以轻松检查文件的一致性,忽略错误(空记录),检查每个记录中的字段数等。
答案 2 :(得分: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]) });
}
现在你有个人信息列表。
答案 3 :(得分:0)
通用列表(在此处的其他2个当前答案中使用)是最好的方法。但是,如果您需要将数据放在数组中(正如您之前的question似乎表明的那样),那么您可以像这样修改教授的代码:
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
您也可以使用struct
或class
并拥有一个包含该对象的数组,但看起来您教授希望您使用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
我还没有对代码进行测试,但如果您必须使用数组,这将有助于您。