Lista obiektów typu klasy i wczytywanie z pliku

0

Hej,

Mam banalny program który polega na zapisaniu danych z pliku txt oddzielonych znakiem tab do poszczegolnych właściowości w liście obiektów, jednak z przyczyn mi nie znanych program cała liste wypełnia ostatnim wierszem z pliku TXT.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace KsiazkaAdresowa
{
	public partial class Form1 : Form
	{
		List<PersonEntry> Kandydaci = new List<PersonEntry>();
		PersonEntry TempPerson = new PersonEntry();
		List<string> LudzieTXT = new List<string>();
		StreamReader inputFile;
		public Form1()
		{
			InitializeComponent();
		}

		private void btnWczytaj_Click(object sender, EventArgs e)
		{
			if (openFile.ShowDialog() == DialogResult.OK)
			{
				inputFile = File.OpenText(openFile.FileName);

				while (!inputFile.EndOfStream)
				{
					LudzieTXT.Add(inputFile.ReadLine());
				}

				foreach (string czlowiek_dane in LudzieTXT)
				{
					string[] podzial = czlowiek_dane.Split('\t');
					TempPerson.Name = podzial[0];
					TempPerson.Mail = podzial[1];
					TempPerson.Number = podzial[2];

					MessageBox.Show(TempPerson.Name); // tutaj jest ok wyświetla pierwsze wyrażenie sprzed znaku tab z każdego wiersza

					Kandydaci.Add(TempPerson);
				}

				MessageBox.Show(Kandydaci[0].Name); // tutaj wyświetla tylko ostatnio dodany wiersz
				MessageBox.Show(Kandydaci[1].Name); // tutaj wyświetla tylko ostatnio dodany wiersz
				MessageBox.Show(Kandydaci[2].Name); // tutaj wyświetla tylko ostatnio dodany wiersz

			}
		}
	}

	class PersonEntry
	{
		public string Name { get; set; }
		public string Mail { get; set; }
		public string Number { get; set; }
	}
}

0

Jak wyglądają te dane w pliku?

0
Anna Kowalska	[email protected]	121 022 588
Andrzej Kowalski	[email protected]	121455588
Adrian Bez	[email protected]	888777999
Jakub Taky	[email protected]	664 888 777
Lew Trocki	[email protected]	121 121 221
0

Ja bym zrobił jakiś parser do tego. Budowa jest bardzo zbliżona do .csv z tym, że separatorem są dwie spacje, czy to tam między tym jest. Na początek może wczytaj cały tekst z pliku i później go obrabiaj

string fileContent = File.ReadAllText(openFile.FileName);

Albo linia po linii

 using (StreamReader sr = new StreamReader(path)) 
            {
                while (sr.Peek() >= 0) 
                {
                    string linia = sr.ReadLine();
                }
            }
3

Twoim problemem jest to że używasz jednego obiektu PersonEntry . Tworzysz ten obiekt przed pętlą i ciągle nadpisujesz i dodajesz ten sam obiekt do listy.W pierwszym wierszu pętli foreach zrób:

TempPerson = new PersonEntry();
0

Dziękuję, pomogło.

1

na przyszłość polecam: https://www.nuget.org/packages/CsvHelper/ ale to raczej przy czymś bardziej skomplikowanym

1 użytkowników online, w tym zalogowanych: 0, gości: 1