Member 11381811 Ответов: 2

Нужно прочитать txt строки конец экспорта в список объектов


пример строки txt - файла bile line в список певцов, у которых 1 певец имеет список песен..Откуда Singer.txt-Да..

Джон|Ньюман|певец|09112000|мужчина|song1;song2;song3
Ezrea|Leusag|певец|09112020|мужчина|song1;song2;song3

Список<певец>

классный певец
Имя
Фамилия
Певец
DateOfBirth
Жандр
Список<песен>
---Объект Songs имеет свойство SongName

в одном случае мне нужно полностью заполнить эту строку в списке "певец", у которого есть список "песни".;

Что я уже пробовал:

using (StreamReader str = new StreamReader(@"C:\Singer.txt"))
            {
                char[] delimiterChars = { '|', ';'};
                
                while ((line = str.ReadLine()) != null)
                {
                    string[] word = line.Split(delimiterChars);

                    listSinger.Add(new Singer(
                        int.Parse(
                            word[0]), 
                            word[1], 
                            word[2], 
                            word[3], 
                            DateTime.ParseExact(word[4], "ddmmyyyy", CultureInfo.InvariantCulture)));
                }                
            }

Christian Graus

Этот код выглядит разумным, если предположить, что конструктор существует. Почему это не работает?

2 Ответов

Рейтинг:
0

Mohibur Rashid

ваш код неверен, судя по вашим данным.

John|Newman|Singer|09112000|Male|song1;song2;song3
Ezrea|Leusag|Singer|09112020|Male|song1;song2;song3

твой
0=имя, угадывание, должно быть строкой
1=фамилия, угадывание, должна быть строкой
2=род занятий(угадывание), должна быть строка
3=нулевая дополненная дата, угадывание, ddmmyyyy отформатировано 8 байт, должно быть строкой.
4=Секс, должна быть строка
5=разделенное точкой с запятой название песни, опять же угадав, должно быть строкой

Я вижу конструктор, который выглядит так:
new Singer(int, string, string, string, DateTime)

Вот вы и пытаетесь разобрать имя to int
индекс 4 выглядит как Sex(Male/Female), который вы пытаетесь разобрать как DateTime
для обоих вышеперечисленных вопросов должно быть создано исключение.


Я надеюсь, что вы можете догадаться из этого, что вам нужно было сделать


Рейтинг:
0

Maciej Los

Прежде всего, я бы предложил использовать Файл.Метод ReadAllLines (Строка) (System.IO)[^].
Ваш Singer класс должен выглядеть так:

public class Singer
{
	private string sFName = string.Empty;
	private string sSurname = string.Empty;
	private string sRole  = string.Empty;
	private DateTime dDateOfBirth = new DateTime(1901, 1, 1); //default value
	private string sGenre = string.Empty;
	private List<string> songs = new List<string>();
	
        //instantiate singer from single line
	public Singer(string line)
	{
		string[] parts = line.Split(new string[]{"|"}, StringSplitOptions.RemoveEmptyEntries);
		sFName = parts[0];
		sSurname = parts[1];
		sRole = parts[2];
		dDateOfBirth = DateTime.ParseExact(parts[3], "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture);
		sGenre = parts[4];
		songs = parts[5].Split(new string[]{";"}, StringSplitOptions.RemoveEmptyEntries).ToList();
	}
	
         //instantiate singer from parts
	public Singer(string _FName, string _Surname, string _Role, DateTime _DOB, string _Genre, List<string> _songs)
	{
		sFName = _FName;
		sSurname = _Surname;
		sRole = _Role;
		dDateOfBirth = _DOB;
		sGenre = _Genre;
		songs = _songs;
	}

	public string FirstName
	{
		get { return sFName; }
		set { sFName = value; }
	}

	public string Surname
	{
		get { return sSurname; }
		set { sSurname = value; }
	}
	
	public string Role
	{
		get { return sRole; }
		set { sRole = value; }
	}
	
	public DateTime DateOfBirth
	{
		get { return dDateOfBirth; }
		set { dDateOfBirth = value; }
	}
	
	public string Genre
	{
		get { return sGenre; }
		set { sGenre = value; }
	}	

	public List<string> Songs
	{
		get { return songs; }
		set { songs = value; }
	}	

}


Использование:
string[] lines = File.ReadAllLines("FullFileName.txt");

List<Singer> singers = lines.Select(s=> new Singer(s)).ToList();
foreach(Singer s in singers)
{
    Console.WriteLine("{0} {1}, count of songs: {2}", s.FirstName, s.Surname, s.Songs.Count);
}


Результат:
John Newman, count of songs: 3
Ezrea Leusag, count of songs: 3