Прочитать файл с разделителями и преобразовать в позиционный макет - PullRequest
0 голосов
/ 19 июня 2020

У меня есть файл .txt с этим примером, с большим количеством строк:

20200610;My name ;00000001;Name of my company for example; this is the end;01;

Мне нужно преобразовать этот макет в позиционный. первый столбец с 10 символами, второй с 30, et c. после этого сгенерируйте новый файл с этим новым макетом.

20200610  My name                       00000001(etc)

Как я могу сделать это преобразование в C#? файл уже прочитан.

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Предполагая очень простой ввод (без полей в кавычках), используйте String.Split, а затем используйте String.Format с компонентом выравнивания, интерполируя длины полей.

Например:

var src = "20200610;My name ;00000001;Name of my company for example; this is the end;01;";

var fieldLens = new[] { 10, 30, 8, 30, 30, 2, 1 };

var res = src.Split(';').Select((s, n) => String.Format($"{{0,{-fieldLens[n]}}}", s)).Join();
0 голосов
/ 19 июня 2020

Возможное решение путем создания метода расширения строки

// StringExtension.cs
public static class StringExtension
{
    public static String ToCustomLength(this String value, int cnt)
    {
        if (value.Length == cnt)
            return value;
        else if (value.Length < cnt)
            value = value.PadRight(cnt, ' ');
        else
            value = value.Substring(0, cnt);
        return value;
    }
}


// Program.cs
class cData
{
    public string SomeDate { get; set; }
    public string SomeName { get; set; }
    public string SomeID { get; set; }
    public string SomeCompany { get; set; }
    public string SomeCompany2 { get; set; }
    public string SomeID2 { get; set; }
    public cData(string t)
    {
        // Enforce the rules here
        string[] t2 = t.Split(';');
        if (t2.Count() != 7)
            throw new Exception("Invalid String passed");

        SomeDate = t2[0].ToCustomLength(10);
        SomeName = t2[1].ToCustomLength(30);
        SomeID = t2[2].ToCustomLength(20);
        SomeCompany = t2[3].ToCustomLength(30);
        SomeCompany2 = t2[4].ToCustomLength(30);
        SomeID2 = t2[5].ToCustomLength(5);
    }
}

class Program
{
    static void Main(string[] args)
    {
        cData data = new cData("20200610; My name; 00000001; Name of my company for example; this is the end; 01;");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...