Форматирование строк при помощи табуляции
У меня есть текстовый файл, который содержит в себе некоторые данные. Я сделал так, чтобы оттуда забирались только нужные мне строчки, но я не совсем понимаю, как из них мне составить табличку при помощи табуляции примерно следующего содержания:
MassaSr| Time | Temp
50.3 | 1 | 20*C
122.1 | 1 | 20*C
Сам код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace StreamReaderDemo
{
class Program
{
static void Main(string[] args)
{
string docpath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
Console.WriteLine("Input your txt-file name");
string name = Console.ReadLine();
StreamReader sr = new StreamReader(docpath + @"\" + name + ".txt");
string s;
string t;
string y;
while (sr.EndOfStream != true)
{
s = sr.ReadLine();
t = sr.ReadLine();
y = sr.ReadLine();
if (s.StartsWith("MassaSr:") || t.StartsWith("Time:") || y.StartsWith("Temp:"))
{
Console.WriteLine(s);
Console.WriteLine(t);
Console.WriteLine(y);
}
}
sr.Close();
Console.ReadLine();
}
}
}
Ссылка на файлик со строками: https://disk.yandex.ru/d/pE1WPgTc7VpypA
Заранее спасибо.
Ответы (1 шт):
Табуляция вам не сильно поможет, ведь у вас сложное выравнивание. Проще не пытаться использовать табуляцию, а подсчитать нужное количество пробелов. Для этого, однако, понадобится как минимум два прохода по данным: подсчёт максимальной ширины и сам вывод.
Кешировать ли данные в памяти, чтобы не читать файл дважды, и как именно вытаскивать данные из файла, решать вам. У меня получился такой пример форматирования:
string headerMassaSr = "MassaSr", headerTime = "Time", headerTemp = "Temp";
int maxMassaSrWidth = headerMassaSr.Length, maxTimeWidth = headerTime.Length, maxTempWidth = headerTemp.Length;
foreach (var item in GetEntries())
{
maxMassaSrWidth = Math.Max(maxMassaSrWidth, item.MassaSr.Length);
maxTimeWidth = Math.Max(maxTimeWidth, item.Time.Length);
maxTempWidth = Math.Max(maxTempWidth, item.Temp.Length);
}
Console.WriteLine($"| {headerMassaSr.PadLeft(maxMassaSrWidth)} | {headerTime.PadRight(maxTimeWidth)} | {headerTemp.PadLeft(maxTempWidth)} |");
Console.WriteLine($"|-{new string('-', maxMassaSrWidth)}-|-{new string('-', maxTimeWidth)}-|-{new string('-', maxTempWidth)}-|");
foreach (var item in GetEntries())
Console.WriteLine($"| {item.MassaSr.PadLeft(maxMassaSrWidth)} | {item.Time.PadRight(maxTimeWidth)} | {item.Temp.PadLeft(maxTempWidth)} |");
с определением
record Entry(string MassaSr, string Time, string Temp);
IEnumerable<Entry> GetEntries()
{
// тут или читайте и разбирайте файл, или возвращайте
// закешированную копию, как вам кажется правильным
}
Вывод на консоль:
| MassaSr | Time | Temp |
|---------|------|-------|
| 50.3 | 1 | 1 *C |
| 122.1 | 1 | 20 *C |
| 409.0 | 15 | 21 *C |