FileHelpers Вопрос - Как читать файл фиксированной длины без разрывов строки или разделителей - PullRequest
0 голосов
/ 05 декабря 2018

Как вы можете использовать FileHelpers для чтения файла фиксированной длины без разрывов строки или разделителей?В основном, от одной до нескольких записей в одной строке.Я должен прочитать в записи фиксированной длины с 13 полями в общей сложности 80 символов.Например, если есть 3 записи, это будет одна строка с 240 символами.Ответ не может идти к источнику и заставить их выводить файл по-другому.Они не сдвинутся с места.Я могу отказаться от FileHelpers, но мне нравится, как он работает, и я сначала хочу посмотреть, возможно ли это, прежде чем я продолжу.Чтобы ответить на этот вопрос, вы должны быть знакомы с FileHelpers.

Вот простой пример, как я объяснил выше, с 34 записями ...

var FileContent = "car  2010Ford      Mustang        Truck2011Chevy     S10            Car  2018Toyota    Corola         SUV  2017Jeep      Wrangler       ";

[FixedLengthRecord(FixedMode.ExactLength)]
public class dtoCarRecord
{
    [FieldFixedLength(5)]
    public string Type;

    [FieldFixedLength(4)]
    public string Year;

    [FieldFixedLength(10)]
    public string Make;

    [FieldFixedLength(15)]
    public string Model;
}

void ApplyDateUpdates(object parameter)
    {
        var raRecords = new List<dtoRARecord>();

        var engine = new FileHelperAsyncEngine<dtoRARecord>();

        // Read
        using (engine.BeginReadFile((string)parameter))
        {
            // The engine is IEnumerable
            foreach (dtoRARecord detail in engine)
            {
                // your code here
                raRecords.Add(detail);
            }
        }
    }

Я ожидаю 4 записи изэтого файла.

1 Ответ

0 голосов
/ 05 декабря 2018

Просто разделите ваш файл каждые 80 символов перед его импортом.

private static string SplitIntoChunks(string text, int maxWidth)
{
    var sb = new StringBuilder(text);

    for (int i = 1; i < (sb.Length / maxWidth); i++)
    {
        int insertPosition = i * maxWidth + i - 1;
        sb.Insert(insertPosition, "\n");
    }

    return sb.ToString();
}

var splitIntoChunks = SplitIntoChunks(FileContent, 34);

using (engine.BeginReadString(splitIntoChunks))
{
    // The engine is IEnumerable
    foreach (dtoRARecord detail in engine)
    {
        // your code here
        raRecords.Add(detail);
    }
}
Assert.AreEqual(4, raRecords.Count());
...