固定幅のテキスト ファイルを読み取り、各要素をクラス オブジェクトに格納しようとしています。テキスト ファイルの各行をチェックして、どの解析アクションを実行する必要があるかを確認する必要があります。行 1000 と 1001 はそれぞれ異なる方法で解析する必要があり、行 1002 から 1004 は同じ解析アクションを使用します。ファイルを読み込んで正しく解析していますが、クラス オブジェクトに要素を追加すると、各 "if" ステートメントでオブジェクトが上書きされます。次に、オブジェクトがリストに追加されると、リストに空の行が含まれます。間違ったアプローチをしているように感じます。私はC#を初めて使用します。これが回答されている場合はお詫び申し上げますが、何時間も検索しても解決策が見つかりません。以下はテキストファイルとコードです。
1000 AttributeOne AttributeTwo
1001 123456.000000 AttributeFour
1002 1234.0 2345.0 3456.0 1003 1234.0 2345.0 3456.0 1004 1234.0 2345.0 3456.0 1000 AttributeOne AttributeTwo
1001 456789.000000 AttributeFour
1002 1234.0 2345.0 3456.0 1003 1234.0 2345.0 3456.0 1004 1234.0 2345.0 3456.0 1000 AttributeOne AttributeTwo
1001 234567.000000 AttributeFour
1002 1234.0 2345.0 3456.0 1003 1234.0 2345.0 3456.0 1004 1234.0 2345.0 3456.0 1000 AttributeOne AttributeTwo
1001 345678.000000 AttributeFour
1002 1234.0 2345.0 3456.0 1003 1234.0 2345.0 3456.0 1004 1245.0 3
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
namespace list_question
{
public class someObject
{
//Line 1
public int Line1_ID;
public string Line1_Attribute1;
public string Line1_Attribute2;
//Line 2
public int Line2_ID;
public decimal Line2_Attribute3;
public string Line2_Attribute4;
//Line 3
public int Line3_ID;
public decimal data_pos1;
public decimal data_pos2;
public decimal data_pos3;
}
class Program
{
static void Main(string[] args)
{
string filepathRead = @"C:\Users\user1\Desktop\SampleFile.txt";
List<someObject> somObList = new List<someObject>();
try
{
FileStream fs = new FileStream(filepathRead, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fs);
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if ((line.Substring(0, 4) == "1000"))
{
string[] strArrFields1 = Regex.Split(line, @"(.{6})" + "(.{14})" + "(.{20})").Where(s => !string.IsNullOrEmpty(s)).ToArray();
someObject obj_1 = new someObject();
obj_1.Line1_ID = int.Parse(strArrFields1[0].TrimEnd(' '));
obj_1.Line1_Attribute1 = strArrFields1[1].TrimEnd(' ');
obj_1.Line1_Attribute2 = strArrFields1[2].TrimEnd(' ');
somObList.Add(obj_1);
}
else if ((line.Substring(0, 4) == "1001"))
{
string[] strArrFields2 = Regex.Split(line, @"(.{6})" + "(.{20})" + "(.{15})").Where(s => !string.IsNullOrEmpty(s)).ToArray();
someObject obj_1 = new someObject();
obj_1.Line2_ID = int.Parse(strArrFields2[0].TrimEnd(' '));
obj_1.Line2_Attribute3 = decimal.Parse(strArrFields2[1].TrimEnd(' '));
obj_1.Line2_Attribute4 = strArrFields2[2].TrimEnd(' ');
somObList.Add(obj_1);
}
else
{
string[] strArrFields3 = Regex.Split(line, @"(.{6})" + "(.{7})" + "(.{7})" + "(.{7})").Where(s => !string.IsNullOrEmpty(s)).ToArray();
someObject obj_1 = new someObject();
obj_1.Line3_ID = int.Parse(strArrFields3[0].TrimEnd(' '));
obj_1.data_pos1 = decimal.Parse(strArrFields3[1].TrimEnd(' '));
obj_1.data_pos2 = decimal.Parse(strArrFields3[2].TrimEnd(' '));
obj_1.data_pos3 = decimal.Parse(strArrFields3[3].TrimEnd(' '));
somObList.Add(obj_1);
}
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Program Exited");
Environment.Exit(99);
}
foreach (someObject o in somObList)
{
Console.WriteLine("{0},{1},{2}\n{3},{4},{5}\n{6},{7},{8},{9}",
o.Line1_ID, o.Line1_Attribute1, o.Line1_Attribute2, o.Line2_ID, o.Line2_Attribute3, o.Line2_Attribute4, o.Line3_ID, o.data_pos1, o.data_pos2, o.data_pos3);
}
somObList.Clear();
}
}
}