Реализовать вывод строк после считывания из файла, и Конвертации данных
Всем привет. Первоначально задача стояла в том, чтобы реализовать считывание данных из файла, определение типа данных, и дополнение данных строкой с указанием типа данных, а так заменой (_) на пробел. Столкнулся с такой проблемой, по выводу в консоль в виде таблицы. Программа выполняет считывание данных из файла. Сортирует по номеру и конвертирует данные в соответствующий тип из string. Но при выводе в консоль, данные не разделяются столбцами и выглядят смешанно, а требуется произвести вывод по столбцам.
№ Серия Наименование Дополнение
1 677492 12Тм_54 Допол
1 Привет 76 1з
7 654 Это Твоё
2 Тестовое -=-=-= СимволыИлиНет?
0 Задание ЉµЉ 1787_-_?
2147483747 Удачи На_полях Правосудия
Вот код программы.
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.IO;
using System;
class Program
{
public record Item(long Number, IEnumerable<string> OtherData);
static void Main(string[] args)
{
//Загружаю все элементы из файла
var items = LoadItemsFromFile("file.txt");
//Сначала сортирую элементы по номеру, а затем прохожусь по ним циклом
foreach (var item in items.OrderBy(x => x.Number))
{
//Каждый элемент "определяю" и вывожу на консоль
DefineItemTypeAndWrite(item);
}
}
private static IEnumerable<Item> LoadItemsFromFile(string path)
=> File.ReadAllLines(path).Select(x =>
{
var data = x.Split();
return new Item(long.Parse(data[0]), data.Skip(1));
});
private static Type[] types = new[]
{
typeof(sbyte), typeof(byte),
typeof(short), typeof(ushort),
typeof(int), typeof(uint),
typeof(long), typeof(ulong),
typeof(float), typeof(double), typeof(decimal),
};
private static void DefineItemTypeAndWrite(Item item)
{
//Вывожу номер, т.к по нему никаких проверок не надо делать
Console.Write($"№: {item.Number} ");
//По каждому элементу(серия, наименование, дополнение) пытаюсь подобрать тип от базового
//sbyte до string и при первой попытке вывожу его
foreach (string data in item.OtherData)
{
var type = types.FirstOrDefault(x => TypeDescriptor.GetConverter(x)?.IsValid(data) == true) ?? typeof(string);
// Если надо преобразовать, то: var value = TypeDescriptor.GetConverter(type)?.ConvertFromString(data);
Console.Write($" {data} - {type.Name}");
}
Console.WriteLine();
}
}
Ответы (1 шт):
Автор решения: Олег Дмитриев
→ Ссылка
Итоговый ответ получился такой:
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.IO;
using System;
using System.Runtime.InteropServices;
class Program
{
public record Item(long Number, IEnumerable<string> OtherData);
static void Main(string[] args)
{
//Загружаю все элементы из файла
var items = LoadItemsFromFile("file.txt");
Console.WriteLine("|{0,-15}||{1,-25}||{2,-25}||{3,-25}|", " №", " Серия", " Наименование", " Дополнение");
//Сначала сортирую элементы по номеру, а затем прохожусь по ним циклом
foreach (var item in items.OrderBy(x => x.Number))
{
//Каждый элемент "определяю" и вывожу на консоль
DefineItemTypeAndWrite(item);
}
}
private static IEnumerable<Item> LoadItemsFromFile(string path)
=> File.ReadAllLines(path).Select(x =>
{
var data = x.Split();
return new Item(long.Parse(data[0]), data.Skip(1));
});
private static Type[] types = new[]
{
typeof(sbyte), typeof(byte),
typeof(short), typeof(ushort),
typeof(int), typeof(uint),
typeof(long), typeof(ulong),
typeof(float), typeof(double), typeof(decimal),
};
private static void DefineItemTypeAndWrite(Item item)
{
//Вывожу номер
Console.Write("|{0,-15}|",$" {item.Number} ");
foreach (string data in item.OtherData)
{
var type = types.FirstOrDefault(x => TypeDescriptor.GetConverter(x)?.IsValid(data) == true) ?? typeof(string);
// Если надо преобразовать, то: var value = TypeDescriptor.GetConverter(type)?.ConvertFromString(data);
Console.Write("|{0, -25}|", $" {data.Replace("_"," ")} - {type.Name}");
}
Console.WriteLine();
}
}

