hamid18 Ответов: 1

Создание экземпляров из другого класса путем чтения текстового файла


Это содержимое моего текстового файла. Сначала я должен прочитать текстовый файл, а затем я должен создать экземпляры каждого сигнала через другой класс. Я могу извлечь данные из словаря. Теперь мне нужно создать еще один класс, который будет создавать объекты класса Signal.Ребята, не могли бы вы мне помочь?
Спасибо.

Signal 1
00000000111101010

Signal 2
1010

Signal 3
0111100001110


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

  class Signals
    {

        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private ulong data;

        public ulong Data
        {
            get { return data; }
            set { data = value; }
        }
        
    }
class Program
    {
        static void Main(string[] args)
        {
 StreamReader file = new StreamReader(@"C:\Users\chaudhry\source\repos\ReadingTextFile\ReadingTextFile\SignalFile.txt");
         
            List<string> datas = new List<string>();

            Dictionary<string, ulong> dict = new Dictionary<string, ulong>();
            string line = string.Empty;
             while ((line = file.ReadLine()) != null)

            
            {
                if (line != "")
                {
                    datas.Add(line);

                }

            }
            file.Close();

            for (int i = 0; i < datas.Count; i = i + 2)
            {

                dict.Add(datas[i], ulong.Parse(datas[i + 1]));

               

            }
foreach (var kvp in dict)
            {
                Signals signals = new Signals();
                signals.Name = kvp.Key;
                signals.Data = kvp.Value;

                Console.WriteLine(" Name : {0} Data :{1}",signals.Name,signals.Data);


                
                

            }

           




        }

        }     

1 Ответов

Рейтинг:
7

Maciej Los

Я бы предложил использовать Файл.Метод ReadAllLines (System.IO)[^] для чтения данных из текстового файла.

[РЕДАКТИРОВАТЬ]
Ваш класс нуждается в некоторых улучшениях:

Согласно нашей дискуссии, я внес некоторые изменения в класс:

public class Signal
{
	private string sName = string.Empty;
	private byte[] oData = new byte[]{};
	
	public Signal(string _Name, string _data)
	{
		sName = _Name;
		oData = _data.Select(x=>byte.Parse(x.ToString())).ToArray();
	}
		
	public string Name
	{
		get => sName;
		set => sName = value;
	}
	
	public byte[] Data
	{
		get => oData;
		set => oData = value;
		
	}
	
	public List<KeyValuePair<byte, int>> Map
	{
		get
		{
			List<KeyValuePair<byte, int>> map = new List<KeyValuePair<byte, int>>();
			int i = 0;
			int j = 0;
			int l = oData.Length;
			while(i<l)
			{
				int k = 0;
				j = i;
				while(oData[i]==oData[j])
				{
					k++;
					j++;
					if(j==l) break;
				}
				KeyValuePair<byte, int> kvp = new KeyValuePair<byte, int>(oData[i], k);
				map.Add(kvp);
				i = j-1;
				i++;
			}
			return map;
		}
	}
	
	public override string ToString()
	{
		return string.Format("{0}\n{1}\n", sName, string.Join("", oData));
	}
}


Использование:
void Main()
{
	string[] lines = File.ReadAllLines("FullFileName.txt");
	//get names
	var names = lines
		.Where(x=>x.Trim().StartsWith("S"))
		.ToList();
        //get data
	var datas = lines
		.Where(x=>!x.Trim().StartsWith("S") && x.Trim()!=string.Empty)
		.ToList();
        //create list of Singal class
	List<Signal> signals = names.Zip(datas,
		(n, d)=> new Signal(n, d))
		.ToList();
	foreach(Signal s in signals)
	{
		Console.WriteLine("{0} '{1}'=>[{2}]", s.Name, string.Join("", s.Data), string.Join("|", s.Map.Select(x=>x.Key + ":" + x.Value)));
	}

}


Пример вывода:
Signal 1 '00000000111101010'=>[0:8|1:4|0:1|1:1|0:1|1:1|0:1]
Signal 2 '1010'=>[1:1|0:1|1:1|0:1]
Signal 3 '0111100001110'=>[0:1|1:4|0:4|1:3|0:1]


Удачи вам!


hamid18

Большое спасибо Мацей.

Maciej Los

Всегда пожалуйста.

hamid18

Данные повторяют паттерн 0s и 1s. Я не хочу сохранять этот повторяющийся шаблон данных. Я хочу сделать карту, подобную той, о которой я упоминал ниже. Я знаю, что не могу использовать словарь здесь. Поскольку ключ должен быть уникальным в словаре. Я не знаю никакой другой структуры данных, которая делает отображение. Так, как я хочу сделать. Потому что в конце концов я получу исходные данные из этого сопоставления.
0 5
1 6
0 4
1 3
0 1

Maciej Los

Извините, но я вас не понимаю... Что вы имеете в виду под этим "Данные повторяют паттерн 0s и 1s."?
Значит ли это, что у вас есть только сигналы 0 и 1? Вы хотите сгруппировать данные по их названию и суммировать данные ulong?
[РЕДАКТИРОВАТЬ]
Если я вас хорошо понимаю, вам не нужно использовать объект словаря. Видеть:

	var signals = names.Zip(datas,
		(n, d)=> new Signal(n, d))
		.GroupBy(x=>x.Name)
		.Select(grp=> new Signal(grp.Key, (ulong)grp.Sum(y=>(decimal)y.Data)))
		.ToList();

Попробуй!

hamid18

На самом деле свойство Data каждого экземпляра сигнала содержит такие значения, как 01000011111100000111000101. Здесь мы имеем повторение одних и тех же чисел. Мы хотим его уплотнить. как будто мы можем сделать карту, которая
0 1
1 1
0 4
1 6
0 5
это показывает, что если мы начнем с первой цифры, то получим один 0s. Тогда у нас есть один 1С. Тогда у нас есть четыре 0. Таким образом, мы можем сохранить всю последовательность чисел в типе данных int. И в конце концов мы можем получить исходные данные, используя ту же самую карту.

Maciej Los

Оооууу, у меня есть ты.

В этот момент Data свойство хранит данные ulong. Вы хотите реализовать метод отображения 01000011111100000111000101 как массив о и 1?

hamid18

Я хочу сжатие без потерь. Потому что улонг занимает много памяти. И я хочу хранить в int, который будет занимать меньше памяти. Но в то же время я не хочу терять свои сигнальные данные. В конце концов, когда я хочу получить обратно исходные данные, я должен быть в состоянии вернуться.

Я не могу использовать GZipStream.

Maciej Los

Взгляните на обновленный ответ.

hamid18

спасибо...

Maciej Los

Всегда пожалуйста ;)

hamid18

Привет,
Я хочу присвоить первое индексное значение массива байтов int. Ни я не получаю ни ошибки компиляции, ни ошибки времени выполнения. Но я не получаю требуемого результата. Я поискал в интернете и узнал, что если у нас есть 4 индекса, то мы можем преобразовать их в int. Но мне нужен только 1-й индекс для работы.

Maciej Los

int FirstByteOfFirstSignal  = signals[0].Data[0];<pre>

hamid18

Спасибо :)