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の答えを少し拡張します。

  • 構造体の代わりにクラスを使用する
  • フィールドの代わりにプロパティを使用する
  • プレーンな文字列の代わりに列挙型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])
    });
}
于 2013-04-07T09:13:21.087 に答える
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

structorを使用して、そのオブジェクトを保持する 1 つの配列を使用することもでき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 行を超えるデータがある場合、範囲外のインデックス例外が発生するリスクがあります。これを回避する1つの方法は、上記のコードを、ターゲット配列の境界をチェックする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 に答える